| The Gaudi Framework v32r1 (f65d50dc)

Public Member Functions | Public Attributes | Private Member Functions | Static Private Attributes | List of all members
GaudiTesting.BaseTest.BaseTest Class Reference
Inheritance diagram for GaudiTesting.BaseTest.BaseTest:
[legend]
Collaboration diagram for GaudiTesting.BaseTest.BaseTest:
[legend]

## Public Member Functions
def | __init__ (self)
def | run (self)
def | ValidateOutput (self, stdout, stderr, result)
def | findReferenceBlock (self, reference=None, stdout=None, result=None, causes=None, signature_offset=0, signature=None, id=None)
def | countErrorLines (self, expected={ 'ERROR':0, 'FATAL':0 }, stdout=None, result=None, causes=None)
def | CheckTTreesSummaries (self, stdout=None, result=None, causes=None, trees_dict=None, ignore=r"Basket|.*size|Compression")
def | CheckHistosSummaries (self, stdout=None, result=None, causes=None, dict=None, ignore=None)
def | validateWithReference (self, stdout=None, stderr=None, result=None, causes=None, preproc=None)

## Public Attributes
| program
| args
| reference
| error_reference
| options
| stderr
| timeout
| exit_code
| environment
| unsupported_platforms
| signal
| workdir
| use_temp_dir
| status
| name
| causes
| result
| returnedCode
| out
| err
| proc
| stack_trace
| basedir

## Private Member Functions
def | _expandReferenceFileName (self, reffile)

## Static Private Attributes
| _common_tmpdir = None

## Detailed Description

Definition at line 67 of file BaseTest.py.

## Constructor & Destructor Documentation

## ◆ __init__()

def GaudiTesting.BaseTest.BaseTest.__init__ | ( |  | self | ) |

Definition at line 71 of file BaseTest.py.

71 def __init__(self):
72 self.program = ''
73 self.args = []
74 self.reference = ''
75 self.error_reference = ''
76 self.options = ''
77 self.stderr = ''
78 self.timeout = 600
79 self.exit_code = None
80 self.environment = None
81 self.unsupported_platforms = []
82 self.signal = None
83 self.workdir = os.curdir
84 self.use_temp_dir = False
85 # Variables not for users
86 self.status = None
87 self.name = ''
88 self.causes = []
89 self.result = Result(self)
90 self.returnedCode = 0
91 self.out = ''
92 self.err = ''
93 self.proc = None
94 self.stack_trace = None
95 self.basedir = os.getcwd()
96

## Member Function Documentation

## ◆ _expandReferenceFileName()

def GaudiTesting.BaseTest.BaseTest._expandReferenceFileName | ( |  | self,
|  |  | reffile
| ) |  |
| private

Definition at line 561 of file BaseTest.py.

561 def _expandReferenceFileName(self, reffile):
562 # if no file is passed, do nothing
563 if not reffile:
564 return ""
565
566 # function to split an extension in constituents parts
567 def platformSplit(p):
568 import re
569 delim = re.compile('-' in p and r"[-+]" or r"_")
570 return set(delim.split(p))
571
572 reference = os.path.normpath(
573 os.path.join(self.basedir, os.path.expandvars(reffile)))
574
575 # old-style platform-specific reference name
576 spec_ref = reference[:-3] + GetPlatform(self)[0:3] + reference[-3:]
577 if os.path.isfile(spec_ref):
578 reference = spec_ref
579 else: # look for new-style platform specific reference files:
580 # get all the files whose name start with the reference filename
581 dirname, basename = os.path.split(reference)
582 if not dirname:
583 dirname = '.'
584 head = basename + "."
585 head_len = len(head)
586 platform = platformSplit(GetPlatform(self))
587 if 'do0' in platform:
588 platform.add('dbg')
589 candidates = []
590 for f in os.listdir(dirname):
591 if f.startswith(head):
592 req_plat = platformSplit(f[head_len:])
593 if platform.issuperset(req_plat):
594 candidates.append((len(req_plat), f))
595 if candidates: # take the one with highest matching
596 # FIXME: it is not possible to say if x86_64-slc5-gcc43-dbg
597 # has to use ref.x86_64-gcc43 or ref.slc5-dbg
598 candidates.sort()
599 reference = os.path.join(dirname, candidates[-1][1])
600 return reference
601
602
603 # ======= GAUDI TOOLS =======
604
GaudiTesting.BaseTest.GetPlatform
def GetPlatform(self)
Definition: BaseTest.py:1295

## ◆ CheckHistosSummaries()

def GaudiTesting.BaseTest.BaseTest.CheckHistosSummaries | ( |  | self,
|  |  | stdout = `None`,
|  |  | result = `None`,
|  |  | causes = `None`,
|  |  | dict = `None`,
|  |  | ignore = `None`
| ) |  |

        Compare the TTree summaries in stdout with the ones in trees_dict or in
        the reference file. By default ignore the size, compression and basket
        fields.
        The presence of TTree summaries when none is expected is not a failure.

Definition at line 430 of file BaseTest.py.

430 def CheckHistosSummaries(self,
431 stdout=None,
432 result=None,
433 causes=None,
434 dict=None,
435 ignore=None):
436 """
437 Compare the TTree summaries in stdout with the ones in trees_dict or in
438 the reference file. By default ignore the size, compression and basket
439 fields.
440 The presence of TTree summaries when none is expected is not a failure.
441 """
442 if stdout is None:
443 stdout = self.out
444 if result is None:
445 result = self.result
446 if causes is None:
447 causes = self.causes
448
449 if dict is None:
450 lreference = self._expandReferenceFileName(self.reference)
451 # call the validator if the file exists
452 if lreference and os.path.isfile(lreference):
453 dict = findHistosSummaries(open(lreference).read())
454 else:
455 dict = {}
456
457 from pprint import PrettyPrinter
458 pp = PrettyPrinter()
459 if dict:
460 result["GaudiTest.Histos.expected"] = result.Quote(
461 pp.pformat(dict))
462 if ignore:
463 result["GaudiTest.Histos.ignore"] = result.Quote(ignore)
464
465 histos = findHistosSummaries(stdout)
466 failed = cmpTreesDicts(dict, histos, ignore)
467 if failed:
468 causes.append("histos summaries")
469 msg = "%s: %s != %s" % getCmpFailingValues(dict, histos, failed)
470 result["GaudiTest.Histos.failure_on"] = result.Quote(msg)
471 result["GaudiTest.Histos.found"] = result.Quote(pp.pformat(histos))
472
473 return causes
474
GaudiTesting.BaseTest.cmpTreesDicts
def cmpTreesDicts(reference, to_check, ignore=None)
Definition: BaseTest.py:1086
hivetimeline.read
def read(f, regex='.*', skipevents=0)
Definition: hivetimeline.py:22
GaudiTesting.BaseTest.findHistosSummaries
def findHistosSummaries(stdout)
Definition: BaseTest.py:1258
GaudiTesting.BaseTest.getCmpFailingValues
def getCmpFailingValues(reference, to_check, fail_path)
Definition: BaseTest.py:1120

## ◆ CheckTTreesSummaries()

def GaudiTesting.BaseTest.BaseTest.CheckTTreesSummaries | ( |  | self,
|  |  | stdout = `None`,
|  |  | result = `None`,
|  |  | causes = `None`,
|  |  | trees_dict = `None`,
|  |  | ignore = `r"Basket|.*size|Compression"`
| ) |  |

        Compare the TTree summaries in stdout with the ones in trees_dict or in
        the reference file. By default ignore the size, compression and basket
        fields.
        The presence of TTree summaries when none is expected is not a failure.

Definition at line 385 of file BaseTest.py.

385 def CheckTTreesSummaries(self,
386 stdout=None,
387 result=None,
388 causes=None,
389 trees_dict=None,
390 ignore=r"Basket|.*size|Compression"):
391 """
392 Compare the TTree summaries in stdout with the ones in trees_dict or in
393 the reference file. By default ignore the size, compression and basket
394 fields.
395 The presence of TTree summaries when none is expected is not a failure.
396 """
397 if stdout is None:
398 stdout = self.out
399 if result is None:
400 result = self.result
401 if causes is None:
402 causes = self.causes
403 if trees_dict is None:
404 lreference = self._expandReferenceFileName(self.reference)
405 # call the validator if the file exists
406 if lreference and os.path.isfile(lreference):
407 trees_dict = findTTreeSummaries(open(lreference).read())
408 else:
409 trees_dict = {}
410
411 from pprint import PrettyPrinter
412 pp = PrettyPrinter()
413 if trees_dict:
414 result["GaudiTest.TTrees.expected"] = result.Quote(
415 pp.pformat(trees_dict))
416 if ignore:
417 result["GaudiTest.TTrees.ignore"] = result.Quote(ignore)
418
419 trees = findTTreeSummaries(stdout)
420 failed = cmpTreesDicts(trees_dict, trees, ignore)
421 if failed:
422 causes.append("trees summaries")
423 msg = "%s: %s != %s" % getCmpFailingValues(trees_dict, trees,
424 failed)
425 result["GaudiTest.TTrees.failure_on"] = result.Quote(msg)
426 result["GaudiTest.TTrees.found"] = result.Quote(pp.pformat(trees))
427
428 return causes
429
GaudiTesting.BaseTest.cmpTreesDicts
def cmpTreesDicts(reference, to_check, ignore=None)
Definition: BaseTest.py:1086
hivetimeline.read
def read(f, regex='.*', skipevents=0)
Definition: hivetimeline.py:22
GaudiTesting.BaseTest.getCmpFailingValues
def getCmpFailingValues(reference, to_check, fail_path)
Definition: BaseTest.py:1120
GaudiTesting.BaseTest.findTTreeSummaries
def findTTreeSummaries(stdout)
Definition: BaseTest.py:1064

## ◆ countErrorLines()

def GaudiTesting.BaseTest.BaseTest.countErrorLines | ( |  | self,
|  |  | expected = `{ 'ERROR': 0, 'FATAL': 0 }`,
|  |  | stdout = `None`,
|  |  | result = `None`,
|  |  | causes = `None`
| ) |  |

        Count the number of messages with required severity (by default ERROR and FATAL)
        and check if their numbers match the expected ones (0 by default).
        The dictionary "expected" can be used to tune the number of errors and fatals
        allowed, or to limit the number of expected warnings etc.

Definition at line 337 of file BaseTest.py.

337 def countErrorLines(self,
338 expected={
339 'ERROR': 0,
340 'FATAL': 0
341 },
342 stdout=None,
343 result=None,
344 causes=None):
345 """
346 Count the number of messages with required severity (by default ERROR and FATAL)
347 and check if their numbers match the expected ones (0 by default).
348 The dictionary "expected" can be used to tune the number of errors and fatals
349 allowed, or to limit the number of expected warnings etc.
350 """
351
352 if stdout is None:
353 stdout = self.out
354 if result is None:
355 result = self.result
356 if causes is None:
357 causes = self.causes
358
359 # prepare the dictionary to record the extracted lines
360 errors = {}
361 for sev in expected:
362 errors[sev] = []
363
364 outlines = stdout.splitlines()
365 from math import log10
366 fmt = "%%%dd - %%s" % (int(log10(len(outlines) + 1)))
367
368 linecount = 0
369 for l in outlines:
370 linecount += 1
371 words = l.split()
372 if len(words) >= 2 and words[1] in errors:
373 errors[words[1]].append(fmt % (linecount, l.rstrip()))
374
375 for e in errors:
376 if len(errors[e]) != expected[e]:
377 causes.append('%s(%d)' % (e, len(errors[e])))
378 result["GaudiTest.lines.%s" % e] = result.Quote('\n'.join(
379 errors[e]))
380 result["GaudiTest.lines.%s.expected#" % e] = result.Quote(
381 str(expected[e]))
382
383 return causes
384
GaudiTest.countErrorLines
def countErrorLines(expected={ 'ERROR':0, 'FATAL':0}, **kwargs)
Definition: GaudiTest.py:763

## ◆ findReferenceBlock()

def GaudiTesting.BaseTest.BaseTest.findReferenceBlock | ( |  | self,
|  |  | reference = `None`,
|  |  | stdout = `None`,
|  |  | result = `None`,
|  |  | causes = `None`,
|  |  | signature_offset = `0`,
|  |  | signature = `None`,
|  |  | id = `None`
| ) |  |

        Given a block of text, tries to find it in the output. The block had to be identified by a signature line. By default, the first line is used as signature, or the line pointed to by signature_offset. If signature_offset points outside the block, a signature line can be passed as signature argument. Note: if 'signature' is None (the default), a negative signature_offset is interpreted as index in a list (e.g. -1 means the last line), otherwise the it is interpreted as the number of lines before the first one of the block the signature must appear. The parameter 'id' allow to distinguish between different calls to this function in the same validation code.

Definition at line 281 of file BaseTest.py.

281 def findReferenceBlock(self,
282 reference=None,
283 stdout=None,
284 result=None,
285 causes=None,
286 signature_offset=0,
287 signature=None,
288 id=None):
289 """
290 Given a block of text, tries to find it in the output. The block had to be identified by a signature line. By default, the first line is used as signature, or the line pointed to by signature_offset. If signature_offset points outside the block, a signature line can be passed as signature argument. Note: if 'signature' is None (the default), a negative signature_offset is interpreted as index in a list (e.g. -1 means the last line), otherwise the it is interpreted as the number of lines before the first one of the block the signature must appear. The parameter 'id' allow to distinguish between different calls to this function in the same validation code.
291 """
292
293 if reference is None:
294 reference = self.reference
295 if stdout is None:
296 stdout = self.out
297 if result is None:
298 result = self.result
299 if causes is None:
300 causes = self.causes
301
302 reflines = filter(None,
303 map(lambda s: s.rstrip(), reference.splitlines()))
304 if not reflines:
305 raise RuntimeError("Empty (or null) reference")
306 # the same on standard output
307 outlines = filter(None, map(lambda s: s.rstrip(), stdout.splitlines()))
308
309 res_field = "GaudiTest.RefBlock"
310 if id:
311 res_field += "_%s" % id
312
313 if signature is None:
314 if signature_offset < 0:
315 signature_offset = len(reference) + signature_offset
316 signature = reflines[signature_offset]
317 # find the reference block in the output file
318 try:
319 pos = outlines.index(signature)
320 outlines = outlines[pos - signature_offset:pos + len(reflines) -
321 signature_offset]
322 if reflines != outlines:
323 msg = "standard output"
324 # I do not want 2 messages in causes if the function is called
325 # twice
326 if not msg in causes:
327 causes.append(msg)
328 result[res_field + ".observed"] = result.Quote(
329 "\n".join(outlines))
330 except ValueError:
331 causes.append("missing signature")
332 result[res_field + ".signature"] = result.Quote(signature)
333 if len(reflines) > 1 or signature != reflines[0]:
334 result[res_field + ".expected"] = result.Quote("\n".join(reflines))
335 return causes
336
Containers::map
struct GAUDI_API map
Parametrisation class for map-like implementation.
Definition: KeyedObjectManager.h:25
GaudiTest.findReferenceBlock
def findReferenceBlock(reference, stdout, result, causes, signature_offset=0, signature=None, id=None)
Definition: GaudiTest.py:709

## ◆ run()

def GaudiTesting.BaseTest.BaseTest.run | ( |  | self | ) |

Definition at line 97 of file BaseTest.py.

97 def run(self):
98 logging.debug('running test %s', self.name)
99
100 if self.options:
101 if re.search(
102 r'from\s+Gaudi.Configuration\s+import\s+\*|'
103 'from\s+Configurables\s+import', self.options):
104 optionFile = tempfile.NamedTemporaryFile(suffix='.py')
105 else:
106 optionFile = tempfile.NamedTemporaryFile(suffix='.opts')
107 optionFile.file.write(self.options)
108 optionFile.seek(0)
109 self.args.append(RationalizePath(optionFile.name))
110
111 # If not specified, setting the environment
112 if self.environment is None:
113 self.environment = os.environ
114 else:
115 self.environment = dict(self.environment.items() +
116 os.environ.items())
117
118 platform_id = (os.environ.get('BINARY_TAG')
119 or os.environ.get('CMTCONFIG') or platform.platform())
120 # If at least one regex matches we skip the test.
121 skip_test = bool([
122 None for prex in self.unsupported_platforms
123 if re.search(prex, platform_id)
124 ])
125
126 if not skip_test:
127 # handle working/temporary directory options
128 workdir = self.workdir
129 if self.use_temp_dir:
130 if self._common_tmpdir:
131 workdir = self._common_tmpdir
132 else:
133 workdir = tempfile.mkdtemp()
134
135 # prepare the command to execute
136 prog = ''
137 if self.program != '':
138 prog = self.program
139 elif "GAUDIEXE" in os.environ:
140 prog = os.environ["GAUDIEXE"]
141 else:
142 prog = "Gaudi.exe"
143
144 dummy, prog_ext = os.path.splitext(prog)
145 if prog_ext not in [".exe", ".py", ".bat"]:
146 prog += ".exe"
147 prog_ext = ".exe"
148
149 prog = which(prog) or prog
150
151 args = map(RationalizePath, self.args)
152
153 if prog_ext == ".py":
154 params = ['python', RationalizePath(prog)] + args
155 else:
156 params = [RationalizePath(prog)] + args
157
158 validatorRes = Result({
159 'CAUSE': None,
160 'EXCEPTION': None,
161 'RESOURCE': None,
162 'TARGET': None,
163 'TRACEBACK': None,
164 'START_TIME': None,
165 'END_TIME': None,
166 'TIMEOUT_DETAIL': None
167 })
168 self.result = validatorRes
169
170 # we need to switch directory because the validator expects to run
171 # in the same dir as the program
172 os.chdir(workdir)
173
174 # launching test in a different thread to handle timeout exception
175 def target():
176 logging.debug('executing %r in %s', params, workdir)
177 self.proc = Popen(
178 params, stdout=PIPE, stderr=PIPE, env=self.environment)
179 logging.debug('(pid: %d)', self.proc.pid)
180 self.out, self.err = self.proc.communicate()
181
182 thread = threading.Thread(target=target)
183 thread.start()
184 # catching timeout
185 thread.join(self.timeout)
186
187 if thread.is_alive():
188 logging.debug('time out in test %s (pid %d)', self.name,
189 self.proc.pid)
190 # get the stack trace of the stuck process
191 cmd = [
192 'gdb', '--pid',
193 str(self.proc.pid), '--batch',
194 '--eval-command=thread apply all backtrace'
195 ]
196 gdb = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
197 self.stack_trace = gdb.communicate()[0]
198
199 kill_tree(self.proc.pid, signal.SIGTERM)
200 thread.join(60)
201 if thread.is_alive():
202 kill_tree(self.proc.pid, signal.SIGKILL)
203 self.causes.append('timeout')
204 else:
205 logging.debug('completed test %s', self.name)
206
207 # Getting the error code
208 logging.debug('returnedCode = %s', self.proc.returncode)
209 self.returnedCode = self.proc.returncode
210
211 logging.debug('validating test...')
212 self.result, self.causes = self.ValidateOutput(
213 stdout=self.out, stderr=self.err, result=validatorRes)
214
215 # remove the temporary directory if we created it
216 if self.use_temp_dir and not self._common_tmpdir:
217 shutil.rmtree(workdir, True)
218
219 os.chdir(self.basedir)
220
221 # handle application exit code
222 if self.signal is not None:
223 if int(self.returnedCode) != -int(self.signal):
224 self.causes.append('exit code')
225
226 elif self.exit_code is not None:
227 if int(self.returnedCode) != int(self.exit_code):
228 self.causes.append('exit code')
229
230 elif self.returnedCode != 0:
231 self.causes.append("exit code")
232
233 if self.causes:
234 self.status = "failed"
235 else:
236 self.status = "passed"
237
238 else:
239 self.status = "skipped"
240
241 logging.debug('%s: %s', self.name, self.status)
242 field_mapping = {
243 'Exit Code': 'returnedCode',
244 'stderr': 'err',
245 'Arguments': 'args',
246 'Environment': 'environment',
247 'Status': 'status',
248 'stdout': 'out',
249 'Program Name': 'program',
250 'Name': 'name',
251 'Validator': 'validator',
252 'Output Reference File': 'reference',
253 'Error Reference File': 'error_reference',
254 'Causes': 'causes',
255 # 'Validator Result': 'result.annotations',
256 'Unsupported Platforms': 'unsupported_platforms',
257 'Stack Trace': 'stack_trace'
258 }
259 resultDict = [(key, getattr(self, attr))
260 for key, attr in field_mapping.iteritems()
261 if getattr(self, attr)]
262 resultDict.append(('Working Directory',
263 RationalizePath(
264 os.path.join(os.getcwd(), self.workdir))))
265 # print dict(resultDict).keys()
266 resultDict.extend(self.result.annotations.iteritems())
267 # print self.result.annotations.keys()
268 return dict(resultDict)
269
GaudiTesting.BaseTest.RationalizePath
def RationalizePath(p)
Definition: BaseTest.py:622
Containers::map
struct GAUDI_API map
Parametrisation class for map-like implementation.
Definition: KeyedObjectManager.h:25
GaudiTesting.BaseTest.which
def which(executable)
Definition: BaseTest.py:632
GaudiTesting.BaseTest.kill_tree
def kill_tree(ppid, sig)
Definition: BaseTest.py:44

## ◆ ValidateOutput()

def GaudiTesting.BaseTest.BaseTest.ValidateOutput | ( |  | self,
|  |  | stdout,
|  |  | stderr,
|  |  | result
| ) |  |

Reimplemented in GaudiTesting.QMTTest.QMTTest.

Definition at line 274 of file BaseTest.py.

274 def ValidateOutput(self, stdout, stderr, result):
275 if not self.stderr:
276 self.validateWithReference(stdout, stderr, result, self.causes)
277 elif stderr.strip() != self.stderr.strip():
278 self.causes.append('standard error')
279 return result, self.causes
280

## ◆ validateWithReference()

def GaudiTesting.BaseTest.BaseTest.validateWithReference | ( |  | self,
|  |  | stdout = `None`,
|  |  | stderr = `None`,
|  |  | result = `None`,
|  |  | causes = `None`,
|  |  | preproc = `None`
| ) |  |

    Default validation acti*on: compare standard output and error to the
    reference files.

Definition at line 475 of file BaseTest.py.

475 def validateWithReference(self,
476 stdout=None,
477 stderr=None,
478 result=None,
479 causes=None,
480 preproc=None):
481 '''
482 Default validation acti*on: compare standard output and error to the
483 reference files.
484 '''
485
486 if stdout is None:
487 stdout = self.out
488 if stderr is None:
489 stderr = self.err
490 if result is None:
491 result = self.result
492 if causes is None:
493 causes = self.causes
494
495 # set the default output preprocessor
496 if preproc is None:
497 preproc = normalizeExamples
498 # check standard output
499 lreference = self._expandReferenceFileName(self.reference)
500 # call the validator if the file exists
501 if lreference and os.path.isfile(lreference):
502 causes += ReferenceFileValidator(
503 lreference, "standard output", "Output Diff",
504 preproc=preproc)(stdout, result)
505 elif lreference:
506 causes += ["missing reference file"]
507 # Compare TTree summaries
508 causes = self.CheckTTreesSummaries(stdout, result, causes)
509 causes = self.CheckHistosSummaries(stdout, result, causes)
510 if causes and lreference: # Write a new reference file for stdout
511 try:
512 cnt = 0
513 newrefname = '.'.join([lreference, 'new'])
514 while os.path.exists(newrefname):
515 cnt += 1
516 newrefname = '.'.join([lreference, '~%d~' % cnt, 'new'])
517 newref = open(newrefname, "w")
518 # sanitize newlines
519 for l in stdout.splitlines():
520 newref.write(l.rstrip() + '\n')
521 del newref # flush and close
522 result['New Output Reference File'] = os.path.relpath(
523 newrefname, self.basedir)
524 except IOError:
525 # Ignore IO errors when trying to update reference files
526 # because we may be in a read-only filesystem
527 pass
528
529 # check standard error
530 lreference = self._expandReferenceFileName(self.error_reference)
531 # call the validator if we have a file to use
532 if lreference:
533 if os.path.isfile(lreference):
534 newcauses = ReferenceFileValidator(
535 lreference,
536 "standard error",
537 "Error Diff",
538 preproc=preproc)(stderr, result)
539 else:
540 newcauses += ["missing error reference file"]
541 causes += newcauses
542 if newcauses and lreference: # Write a new reference file for stdedd
543 cnt = 0
544 newrefname = '.'.join([lreference, 'new'])
545 while os.path.exists(newrefname):
546 cnt += 1
547 newrefname = '.'.join([lreference, '~%d~' % cnt, 'new'])
548 newref = open(newrefname, "w")
549 # sanitize newlines
550 for l in stderr.splitlines():
551 newref.write(l.rstrip() + '\n')
552 del newref # flush and close
553 result['New Error Reference File'] = os.path.relpath(
554 newrefname, self.basedir)
555 else:
556 causes += BasicOutputValidator(lreference, "standard error",
557 "ExecTest.expected_stderr")(stderr,
558 result)
559 return causes
560

## Member Data Documentation

## ◆ _common_tmpdir

GaudiTesting.BaseTest.BaseTest._common_tmpdir = None
| static private

Definition at line 69 of file BaseTest.py.

## ◆ args

GaudiTesting.BaseTest.BaseTest.args

Definition at line 73 of file BaseTest.py.

## ◆ basedir

GaudiTesting.BaseTest.BaseTest.basedir

Definition at line 95 of file BaseTest.py.

## ◆ causes

GaudiTesting.BaseTest.BaseTest.causes

Definition at line 88 of file BaseTest.py.

## ◆ environment

GaudiTesting.BaseTest.BaseTest.environment

Definition at line 80 of file BaseTest.py.

## ◆ err

GaudiTesting.BaseTest.BaseTest.err

Definition at line 92 of file BaseTest.py.

## ◆ error_reference

GaudiTesting.BaseTest.BaseTest.error_reference

Definition at line 75 of file BaseTest.py.

## ◆ exit_code

GaudiTesting.BaseTest.BaseTest.exit_code

Definition at line 79 of file BaseTest.py.

## ◆ name

GaudiTesting.BaseTest.BaseTest.name

Definition at line 87 of file BaseTest.py.

## ◆ options

GaudiTesting.BaseTest.BaseTest.options

Definition at line 76 of file BaseTest.py.

## ◆ out

GaudiTesting.BaseTest.BaseTest.out

Definition at line 91 of file BaseTest.py.

## ◆ proc

GaudiTesting.BaseTest.BaseTest.proc

Definition at line 93 of file BaseTest.py.

## ◆ program

GaudiTesting.BaseTest.BaseTest.program

Definition at line 72 of file BaseTest.py.

## ◆ reference

GaudiTesting.BaseTest.BaseTest.reference

Definition at line 74 of file BaseTest.py.

## ◆ result

GaudiTesting.BaseTest.BaseTest.result

Definition at line 89 of file BaseTest.py.

## ◆ returnedCode

GaudiTesting.BaseTest.BaseTest.returnedCode

Definition at line 90 of file BaseTest.py.

## ◆ signal

GaudiTesting.BaseTest.BaseTest.signal

Definition at line 82 of file BaseTest.py.

## ◆ stack_trace

GaudiTesting.BaseTest.BaseTest.stack_trace

Definition at line 94 of file BaseTest.py.

## ◆ status

GaudiTesting.BaseTest.BaseTest.status

Definition at line 86 of file BaseTest.py.

## ◆ stderr

GaudiTesting.BaseTest.BaseTest.stderr

Definition at line 77 of file BaseTest.py.

## ◆ timeout

GaudiTesting.BaseTest.BaseTest.timeout

Definition at line 78 of file BaseTest.py.

## ◆ unsupported_platforms

GaudiTesting.BaseTest.BaseTest.unsupported_platforms

Definition at line 81 of file BaseTest.py.

## ◆ use_temp_dir

GaudiTesting.BaseTest.BaseTest.use_temp_dir

Definition at line 84 of file BaseTest.py.

## ◆ workdir

GaudiTesting.BaseTest.BaseTest.workdir

Definition at line 83 of file BaseTest.py.

The documentation for this class was generated from the following file:

- GaudiPolicy/python/GaudiTesting/BaseTest.py