annotate bitten/build/monotools.py @ 605:c94481bc4646

0.6dev: Reverting [677] as many of these paths are also used for URLs, and hadn't considered this change enough. No major point in changing code that already works well, so simply reverting seems the best idea...
author osimons
date Thu, 30 Jul 2009 19:51:11 +0000
parents 7af6ebc30ff8
children 7c80375d4817
rev   line source
550
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
1 # -*- coding: utf-8 -*-
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
2 #
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
3 # Copyright (C) 2005-2007 Christopher Lenz <cmlenz@gmx.de>
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
4 # Copyright (C) 2006 Matthew Good <matt@matt-good.net>
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
5 # Copyright (C) 2007 Edgewall Software
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
6 # Copyright (C) 2009 Grzegorz Sobanski <silk@boktor.net>
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
7 # All rights reserved.
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
8 #
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
9 # This software is licensed as described in the file COPYING, which
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
10 # you should have received as part of this distribution. The terms
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
11 # are also available at http://bitten.edgewall.org/wiki/License.
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
12
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
13 """Recipe commands for tools commonly used in Mono projects."""
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
14
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
15 from glob import glob
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
16 import logging
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
17 import os
605
c94481bc4646 0.6dev: Reverting [677] as many of these paths are also used for URLs, and hadn't considered this change enough. No major point in changing code that already works well, so simply reverting seems the best idea...
osimons
parents: 603
diff changeset
18 import posixpath
550
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
19 import shlex
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
20 import tempfile
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
21
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
22 from bitten.build import CommandLine
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
23 from bitten.util import xmlio
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
24
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
25 log = logging.getLogger('bitten.build.monotools')
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
26
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
27 __docformat__ = 'restructuredtext en'
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
28
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
29
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
30 def _parse_suite(element):
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
31 for child in element.children('results'):
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
32 testcases = list(child.children('test-case'))
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
33 if testcases:
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
34 yield element, testcases
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
35
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
36 for xmlsuite in child.children('test-suite'):
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
37 for suite in _parse_suite(xmlsuite):
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
38 yield suite
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
39
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
40
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
41 def _get_cases(fileobj):
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
42 for testsuite in xmlio.parse(fileobj).children('test-suite'):
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
43 for suite in _parse_suite(testsuite):
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
44 yield suite
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
45
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
46
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
47 def nunit(ctxt, file_=None):
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
48 """Extract test results from a NUnit XML report.
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
49
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
50 :param ctxt: the build context
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
51 :type ctxt: `Context`
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
52 :param file\_: path to the NUnit XML test results; may contain globbing
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
53 wildcards for matching multiple results files
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
54 """
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
55 assert file_, 'Missing required attribute "file"'
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
56 try:
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
57 total, failed = 0, 0
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
58 results = xmlio.Fragment()
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
59 for path in glob(ctxt.resolve(file_)):
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
60 fileobj = file(path, 'r')
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
61 try:
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
62 for suite, testcases in _get_cases(fileobj):
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
63 for testcase in testcases:
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
64 test = xmlio.Element('test')
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
65 test.attr['fixture'] = suite.attr['name']
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
66 if 'time' in testcase.attr:
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
67 test.attr['duration'] = testcase.attr['time']
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
68 if testcase.attr['executed'] == 'True':
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
69 if testcase.attr['success'] != 'True':
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
70 test.attr['status'] = 'failure'
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
71 failure = list(testcase.children('failure'))
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
72 if failure:
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
73 stacktraceNode = list(failure[0].children('stack-trace'))
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
74 if stacktraceNode:
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
75 test.append(xmlio.Element('traceback')[
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
76 stacktraceNode[0].gettext()
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
77 ])
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
78 failed += 1
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
79 else:
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
80 test.attr['status'] = 'success'
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
81 else:
551
6b4def531a4e Added support for graphing ignored tests (currently only supported for `nunit`)
dfraser
parents: 550
diff changeset
82 test.attr['status'] = 'ignore'
550
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
83
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
84 results.append(test)
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
85 total += 1
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
86 finally:
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
87 fileobj.close()
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
88 if failed:
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
89 ctxt.error('%d of %d test%s failed' % (failed, total,
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
90 total != 1 and 's' or ''))
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
91 ctxt.report('test', results)
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
92 except IOError, e:
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
93 log.warning('Error opening NUnit results file (%s)', e)
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
94 except xmlio.ParseError, e:
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
95 log.warning('Error parsing NUnit results file (%s)', e)
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
96
6a8dcbffdce2 Added support for nunit (applied patch from silk in #348)
dfraser
parents:
diff changeset
97
Copyright (C) 2012-2017 Edgewall Software