The Gaudi Framework  v36r1 (3e2fb5a8)
QMTTest.py
Go to the documentation of this file.
1 # -*- coding: utf-8 -*-
2 
12 from GaudiTesting.BaseTest import *
13 import logging
14 import os
15 import sys
16 
17 
19  def __init__(self, path=None):
20  BaseTest.__init__(self)
21  self.validator = ''
22  if path:
23  self.XMLParser(path)
24 
25  def XMLParser(self, path):
26  '''
27  Parse a QMTest XML test description (.qmt file) to initialize the test
28  instance.
29  '''
30  from string import Template
31 
32  log = logging.getLogger('QMTest.XMLParser')
33  import xml.etree.ElementTree as ET
34  log.debug('parsing %s', path)
35 
36  self.name = '.'.join(
37  os.path.relpath(path, self.basedir).replace('.qmt', '').replace(
38  '.qms', '').split(os.sep))
39 
40  tree = ET.parse(path)
41  for child in tree.getroot():
42  name = child.attrib['name']
43  if hasattr(self, name):
44  log.debug('setting %s', name)
45  value = child[0]
46  if name in ('args', 'unsupported_platforms'):
47  setattr(self, name,
48  [el.text for el in value.findall('text')])
49  elif name == 'environment':
50  for el in value.findall('text'):
51  key, value = el.text.split('=', 1)
52  self.environment[key] = Template(
53  value).safe_substitute(self.environment)
54  else:
55  data = value.text
56  if data is not None:
57  if value.tag == 'integer':
58  data = int(data)
59  setattr(self, name, data)
60 
61  def ValidateOutput(self, stdout, stderr, result):
62  if self.validator:
63 
64  class CallWrapper(object):
65  """
66  Small wrapper class to dynamically bind some default arguments
67  to a callable.
68  """
69 
70  def __init__(self, callable, extra_args={}):
71  self.callable = callable
72  self.extra_args = extra_args
73  # get the list of names of positional arguments
74  from inspect import getargspec
75  self.args_order = getargspec(callable)[0]
76  # Remove "self" from the list of positional arguments
77  # since it is added automatically
78  if self.args_order[0] == "self":
79  del self.args_order[0]
80 
81  def __call__(self, *args, **kwargs):
82  # Check which positional arguments are used
83  positional = self.args_order[:len(args)]
84 
85  kwargs = dict(kwargs) # copy the arguments dictionary
86  for a in self.extra_args:
87  # use "extra_args" for the arguments not specified as
88  # positional or keyword
89  if a not in positional and a not in kwargs:
90  kwargs[a] = self.extra_args[a]
91  return self.callable(*args, **kwargs)
92 
93  # local names to be exposed in the script
94  stdout_ref = self._expandReferenceFileName(self.reference)
95  stderr_ref = self._expandReferenceFileName(self.error_reference)
96  exported_symbols = {
97  "self":
98  self,
99  "stdout":
100  stdout,
101  "stderr":
102  stderr,
103  "result":
104  result,
105  "causes":
106  self.causes,
107  "reference":
108  stdout_ref,
109  "error_reference":
110  stderr_ref,
111  "findReferenceBlock":
112  CallWrapper(self.findReferenceBlock, {
113  "stdout": stdout,
114  "result": result,
115  "causes": self.causes
116  }),
117  "validateWithReference":
118  CallWrapper(
119  self.validateWithReference, {
120  "stdout": stdout,
121  "stderr": stderr,
122  "result": result,
123  "causes": self.causes
124  }),
125  "countErrorLines":
126  CallWrapper(self.countErrorLines, {
127  "stdout": stdout,
128  "result": result,
129  "causes": self.causes
130  }),
131  "checkTTreesSummaries":
132  CallWrapper(self.CheckTTreesSummaries, {
133  "stdout": stdout,
134  "result": result,
135  "causes": self.causes
136  }),
137  "checkHistosSummaries":
138  CallWrapper(self.CheckHistosSummaries, {
139  "stdout": stdout,
140  "result": result,
141  "causes": self.causes
142  })
143  }
144  # print self.validator
145  exec(self.validator, globals(), exported_symbols)
146  return result, self.causes
147  else:
148  return super(QMTTest, self).ValidateOutput(stdout, stderr, result)
GaudiTesting.BaseTest.BaseTest.causes
causes
Definition: BaseTest.py:122
GaudiTesting.BaseTest.BaseTest.CheckHistosSummaries
def CheckHistosSummaries(self, stdout=None, result=None, causes=None, dict=None, ignore=None)
Definition: BaseTest.py:472
GaudiTesting.BaseTest.BaseTest.reference
reference
Definition: BaseTest.py:108
GaudiTesting.BaseTest.BaseTest.validateWithReference
def validateWithReference(self, stdout=None, stderr=None, result=None, causes=None, preproc=None)
Definition: BaseTest.py:517
GaudiTesting.BaseTest.BaseTest.environment
environment
Definition: BaseTest.py:114
GaudiTesting.QMTTest.QMTTest
Definition: QMTTest.py:18
GaudiTesting.QMTTest.QMTTest.ValidateOutput
def ValidateOutput(self, stdout, stderr, result)
Definition: QMTTest.py:61
GaudiTesting.BaseTest.BaseTest.basedir
basedir
Definition: BaseTest.py:129
GaudiTesting.BaseTest.BaseTest.countErrorLines
def countErrorLines(self, expected={ 'ERROR':0, 'FATAL':0 }, stdout=None, result=None, causes=None)
Definition: BaseTest.py:379
GaudiTesting.QMTTest.QMTTest.extra_args
extra_args
Definition: QMTTest.py:72
GaudiTesting.BaseTest.BaseTest.name
name
Definition: BaseTest.py:121
GaudiTesting.QMTTest.QMTTest.validator
validator
Definition: QMTTest.py:21
GaudiTesting.BaseTest.BaseTest._expandReferenceFileName
def _expandReferenceFileName(self, reffile)
Definition: BaseTest.py:603
GaudiTesting.BaseTest.BaseTest.findReferenceBlock
def findReferenceBlock(self, reference=None, stdout=None, result=None, causes=None, signature_offset=0, signature=None, id=None)
Definition: BaseTest.py:322
GaudiTesting.QMTTest.QMTTest.callable
callable
Definition: QMTTest.py:71
GaudiTesting.BaseTest
Definition: BaseTest.py:1
Counter.__call__
__call__
Definition: Counter.py:40
GaudiTesting.BaseTest.BaseTest.CheckTTreesSummaries
def CheckTTreesSummaries(self, stdout=None, result=None, causes=None, trees_dict=None, ignore=r"Basket|.*size|Compression")
Definition: BaseTest.py:427
GaudiTesting.BaseTest.BaseTest
Definition: BaseTest.py:101
GaudiTesting.BaseTest.BaseTest.error_reference
error_reference
Definition: BaseTest.py:109
GaudiTesting.QMTTest.QMTTest.XMLParser
def XMLParser(self, path)
Definition: QMTTest.py:25
GaudiTesting.QMTTest.QMTTest.args_order
args_order
Definition: QMTTest.py:75
GaudiTesting.QMTTest.QMTTest.__init__
def __init__(self, path=None)
Definition: QMTTest.py:19