| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 4a61bdb commit ca8e5aa
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -38,7 +38,7 @@ | |||
| 38 | 38 | ||
| 39 | 39 | # Reset this number to 0 on major V8 upgrades. | |
| 40 | 40 | # Increment by one for each non-official patch applied to deps/v8. | |
| 41 | - 'v8_embedder_string': '-node.1', | ||
| 41 | + 'v8_embedder_string': '-node.2', | ||
| 42 | 42 | ||
| 43 | 43 | ##### V8 defaults for Node.js ##### | |
| 44 | 44 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -341,6 +341,9 @@ def _add_parser_default_options(self, parser): | |||
| 341 | 341 | "color, mono)") | |
| 342 | 342 | parser.add_option("--json-test-results", | |
| 343 | 343 | help="Path to a file for storing json results.") | |
| 344 | + parser.add_option("--junitout", help="File name of the JUnit output") | ||
| 345 | + parser.add_option("--junittestsuite", default="v8tests", | ||
| 346 | + help="The testsuite name in the JUnit output file") | ||
| 344 | 347 | parser.add_option("--exit-after-n-failures", type="int", default=100, | |
| 345 | 348 | help="Exit after the first N failures instead of " | |
| 346 | 349 | "running all tests. Pass 0 to disable this feature.") | |
@@ -776,6 +779,9 @@ def _get_shard_info(self, options): | |||
| 776 | 779 | ||
| 777 | 780 | def _create_progress_indicators(self, test_count, options): | |
| 778 | 781 | procs = [PROGRESS_INDICATORS[options.progress]()] | |
| 782 | + if options.junitout: | ||
| 783 | + procs.append(progress.JUnitTestProgressIndicator(options.junitout, | ||
| 784 | + options.junittestsuite)) | ||
| 779 | 785 | if options.json_test_results: | |
| 780 | 786 | procs.append(progress.JsonTestProgressIndicator( | |
| 781 | 787 | self.framework_name, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,49 @@ | |||
| 1 | + # Copyright 2013 the V8 project authors. All rights reserved. | ||
| 2 | + # Redistribution and use in source and binary forms, with or without | ||
| 3 | + # modification, are permitted provided that the following conditions are | ||
| 4 | + # met: | ||
| 5 | + # | ||
| 6 | + # * Redistributions of source code must retain the above copyright | ||
| 7 | + # notice, this list of conditions and the following disclaimer. | ||
| 8 | + # * Redistributions in binary form must reproduce the above | ||
| 9 | + # copyright notice, this list of conditions and the following | ||
| 10 | + # disclaimer in the documentation and/or other materials provided | ||
| 11 | + # with the distribution. | ||
| 12 | + # * Neither the name of Google Inc. nor the names of its | ||
| 13 | + # contributors may be used to endorse or promote products derived | ||
| 14 | + # from this software without specific prior written permission. | ||
| 15 | + # | ||
| 16 | + # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 17 | + # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 18 | + # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| 19 | + # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| 20 | + # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| 21 | + # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| 22 | + # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| 23 | + # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| 24 | + # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| 25 | + # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| 26 | + # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 27 | + | ||
| 28 | + | ||
| 29 | + import xml.etree.ElementTree as xml | ||
| 30 | + | ||
| 31 | + | ||
| 32 | + class JUnitTestOutput: | ||
| 33 | + def __init__(self, test_suite_name): | ||
| 34 | + self.root = xml.Element("testsuite") | ||
| 35 | + self.root.attrib["name"] = test_suite_name | ||
| 36 | + | ||
| 37 | + def HasRunTest(self, test_name, test_cmd, test_duration, test_failure): | ||
| 38 | + testCaseElement = xml.Element("testcase") | ||
| 39 | + testCaseElement.attrib["name"] = test_name | ||
| 40 | + testCaseElement.attrib["cmd"] = test_cmd | ||
| 41 | + testCaseElement.attrib["time"] = str(round(test_duration, 3)) | ||
| 42 | + if len(test_failure): | ||
| 43 | + failureElement = xml.Element("failure") | ||
| 44 | + failureElement.text = test_failure | ||
| 45 | + testCaseElement.append(failureElement) | ||
| 46 | + self.root.append(testCaseElement) | ||
| 47 | + | ||
| 48 | + def FinishAndWrite(self, f): | ||
| 49 | + xml.ElementTree(self.root).write(f, "UTF-8") | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -11,6 +11,7 @@ | |||
| 11 | 11 | import time | |
| 12 | 12 | ||
| 13 | 13 | from . import base | |
| 14 | + from ..local import junit_output | ||
| 14 | 15 | ||
| 15 | 16 | ||
| 16 | 17 | def print_failure_header(test): | |
@@ -258,6 +259,45 @@ def _clear_line(self, last_length): | |||
| 258 | 259 | print(("\r" + (" " * last_length) + "\r"), end='') | |
| 259 | 260 | ||
| 260 | 261 | ||
| 262 | + class JUnitTestProgressIndicator(ProgressIndicator): | ||
| 263 | + def __init__(self, junitout, junittestsuite): | ||
| 264 | + super(JUnitTestProgressIndicator, self).__init__() | ||
| 265 | + self._requirement = base.DROP_PASS_STDOUT | ||
| 266 | + | ||
| 267 | + self.outputter = junit_output.JUnitTestOutput(junittestsuite) | ||
| 268 | + if junitout: | ||
| 269 | + self.outfile = open(junitout, "w") | ||
| 270 | + else: | ||
| 271 | + self.outfile = sys.stdout | ||
| 272 | + | ||
| 273 | + def _on_result_for(self, test, result): | ||
| 274 | + # TODO(majeski): Support for dummy/grouped results | ||
| 275 | + fail_text = "" | ||
| 276 | + output = result.output | ||
| 277 | + if result.has_unexpected_output: | ||
| 278 | + stdout = output.stdout.strip() | ||
| 279 | + if len(stdout): | ||
| 280 | + fail_text += "stdout:\n%s\n" % stdout | ||
| 281 | + stderr = output.stderr.strip() | ||
| 282 | + if len(stderr): | ||
| 283 | + fail_text += "stderr:\n%s\n" % stderr | ||
| 284 | + fail_text += "Command: %s" % result.cmd.to_string() | ||
| 285 | + if output.HasCrashed(): | ||
| 286 | + fail_text += "exit code: %d\n--- CRASHED ---" % output.exit_code | ||
| 287 | + if output.HasTimedOut(): | ||
| 288 | + fail_text += "--- TIMEOUT ---" | ||
| 289 | + self.outputter.HasRunTest( | ||
| 290 | + test_name=str(test), | ||
| 291 | + test_cmd=result.cmd.to_string(relative=True), | ||
| 292 | + test_duration=output.duration, | ||
| 293 | + test_failure=fail_text) | ||
| 294 | + | ||
| 295 | + def finished(self): | ||
| 296 | + self.outputter.FinishAndWrite(self.outfile) | ||
| 297 | + if self.outfile != sys.stdout: | ||
| 298 | + self.outfile.close() | ||
| 299 | + | ||
| 300 | + | ||
| 261 | 301 | class JsonTestProgressIndicator(ProgressIndicator): | |
| 262 | 302 | def __init__(self, framework_name, json_test_results, arch, mode): | |
| 263 | 303 | super(JsonTestProgressIndicator, self).__init__() | |
| Back | FazBrowse Home | New Git URL |
0 commit comments