The Gaudi Framework  v36r6 (b1ee9983)
GaudiTesting.BaseTest.BaseTest Class Reference
Inheritance diagram for GaudiTesting.BaseTest.BaseTest:
Collaboration diagram for GaudiTesting.BaseTest.BaseTest:

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 102 of file BaseTest.py.

Constructor & Destructor Documentation

◆ __init__()

def GaudiTesting.BaseTest.BaseTest.__init__ (   self)

Definition at line 106 of file BaseTest.py.

106  def __init__(self):
107  self.program = ""
108  self.args = []
109  self.reference = ""
110  self.error_reference = ""
111  self.options = ""
112  self.stderr = ""
113  self.timeout = 600
114  self.exit_code = None
115  self.environment = dict(os.environ)
116  self.unsupported_platforms = []
117  self.signal = None
118  self.workdir = os.curdir
119  self.use_temp_dir = False
120  # Variables not for users
121  self.status = None
122  self.name = ""
123  self.causes = []
124  self.result = Result(self)
125  self.returnedCode = 0
126  self.out = ""
127  self.err = ""
128  self.proc = None
129  self.stack_trace = None
130  self.basedir = os.getcwd()
131 

Member Function Documentation

◆ _expandReferenceFileName()

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

Definition at line 616 of file BaseTest.py.

616  def _expandReferenceFileName(self, reffile):
617  # if no file is passed, do nothing
618  if not reffile:
619  return ""
620 
621  # function to split an extension in constituents parts
622  def platformSplit(p):
623  import re
624 
625  delim = re.compile("-" in p and r"[-+]" or r"_")
626  return set(delim.split(p))
627 
628  reference = os.path.normpath(
629  os.path.join(self.basedir, os.path.expandvars(reffile))
630  )
631 
632  # old-style platform-specific reference name
633  spec_ref = reference[:-3] + GetPlatform(self)[0:3] + reference[-3:]
634  if os.path.isfile(spec_ref):
635  reference = spec_ref
636  else: # look for new-style platform specific reference files:
637  # get all the files whose name start with the reference filename
638  dirname, basename = os.path.split(reference)
639  if not dirname:
640  dirname = "."
641  head = basename + "."
642  head_len = len(head)
643  platform = platformSplit(GetPlatform(self))
644  if "do0" in platform:
645  platform.add("dbg")
646  candidates = []
647  for f in os.listdir(dirname):
648  if f.startswith(head):
649  req_plat = platformSplit(f[head_len:])
650  if platform.issuperset(req_plat):
651  candidates.append((len(req_plat), f))
652  if candidates: # take the one with highest matching
653  # FIXME: it is not possible to say if x86_64-slc5-gcc43-dbg
654  # has to use ref.x86_64-gcc43 or ref.slc5-dbg
655  candidates.sort()
656  reference = os.path.join(dirname, candidates[-1][1])
657  return reference
658 
659 
660 # ======= GAUDI TOOLS =======
661 

◆ 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 491 of file BaseTest.py.

491  def CheckHistosSummaries(
492  self, stdout=None, result=None, causes=None, dict=None, ignore=None
493  ):
494  """
495  Compare the TTree summaries in stdout with the ones in trees_dict or in
496  the reference file. By default ignore the size, compression and basket
497  fields.
498  The presence of TTree summaries when none is expected is not a failure.
499  """
500  if stdout is None:
501  stdout = self.out
502  if result is None:
503  result = self.result
504  if causes is None:
505  causes = self.causes
506 
507  if dict is None:
508  lreference = self._expandReferenceFileName(self.reference)
509  # call the validator if the file exists
510  if lreference and os.path.isfile(lreference):
511  dict = findHistosSummaries(open(lreference).read())
512  else:
513  dict = {}
514 
515  from pprint import PrettyPrinter
516 
517  pp = PrettyPrinter()
518  if dict:
519  result["GaudiTest.Histos.expected"] = result.Quote(pp.pformat(dict))
520  if ignore:
521  result["GaudiTest.Histos.ignore"] = result.Quote(ignore)
522 
523  histos = findHistosSummaries(stdout)
524  failed = cmpTreesDicts(dict, histos, ignore)
525  if failed:
526  causes.append("histos summaries")
527  msg = "%s: %s != %s" % getCmpFailingValues(dict, histos, failed)
528  result["GaudiTest.Histos.failure_on"] = result.Quote(msg)
529  result["GaudiTest.Histos.found"] = result.Quote(pp.pformat(histos))
530 
531  return causes
532 

◆ 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 445 of file BaseTest.py.

445  def CheckTTreesSummaries(
446  self,
447  stdout=None,
448  result=None,
449  causes=None,
450  trees_dict=None,
451  ignore=r"Basket|.*size|Compression",
452  ):
453  """
454  Compare the TTree summaries in stdout with the ones in trees_dict or in
455  the reference file. By default ignore the size, compression and basket
456  fields.
457  The presence of TTree summaries when none is expected is not a failure.
458  """
459  if stdout is None:
460  stdout = self.out
461  if result is None:
462  result = self.result
463  if causes is None:
464  causes = self.causes
465  if trees_dict is None:
466  lreference = self._expandReferenceFileName(self.reference)
467  # call the validator if the file exists
468  if lreference and os.path.isfile(lreference):
469  trees_dict = findTTreeSummaries(open(lreference).read())
470  else:
471  trees_dict = {}
472 
473  from pprint import PrettyPrinter
474 
475  pp = PrettyPrinter()
476  if trees_dict:
477  result["GaudiTest.TTrees.expected"] = result.Quote(pp.pformat(trees_dict))
478  if ignore:
479  result["GaudiTest.TTrees.ignore"] = result.Quote(ignore)
480 
481  trees = findTTreeSummaries(stdout)
482  failed = cmpTreesDicts(trees_dict, trees, ignore)
483  if failed:
484  causes.append("trees summaries")
485  msg = "%s: %s != %s" % getCmpFailingValues(trees_dict, trees, failed)
486  result["GaudiTest.TTrees.failure_on"] = result.Quote(msg)
487  result["GaudiTest.TTrees.found"] = result.Quote(pp.pformat(trees))
488 
489  return causes
490 

◆ 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 401 of file BaseTest.py.

401  def countErrorLines(
402  self, expected={"ERROR": 0, "FATAL": 0}, stdout=None, result=None, causes=None
403  ):
404  """
405  Count the number of messages with required severity (by default ERROR and FATAL)
406  and check if their numbers match the expected ones (0 by default).
407  The dictionary "expected" can be used to tune the number of errors and fatals
408  allowed, or to limit the number of expected warnings etc.
409  """
410 
411  if stdout is None:
412  stdout = self.out
413  if result is None:
414  result = self.result
415  if causes is None:
416  causes = self.causes
417 
418  # prepare the dictionary to record the extracted lines
419  errors = {}
420  for sev in expected:
421  errors[sev] = []
422 
423  outlines = stdout.splitlines()
424  from math import log10
425 
426  fmt = "%%%dd - %%s" % (int(log10(len(outlines) + 1)))
427 
428  linecount = 0
429  for l in outlines:
430  linecount += 1
431  words = l.split()
432  if len(words) >= 2 and words[1] in errors:
433  errors[words[1]].append(fmt % (linecount, l.rstrip()))
434 
435  for e in errors:
436  if len(errors[e]) != expected[e]:
437  causes.append("%s(%d)" % (e, len(errors[e])))
438  result["GaudiTest.lines.%s" % e] = result.Quote("\n".join(errors[e]))
439  result["GaudiTest.lines.%s.expected#" % e] = result.Quote(
440  str(expected[e])
441  )
442 
443  return causes
444 

◆ 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 344 of file BaseTest.py.

344  def findReferenceBlock(
345  self,
346  reference=None,
347  stdout=None,
348  result=None,
349  causes=None,
350  signature_offset=0,
351  signature=None,
352  id=None,
353  ):
354  """
355  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.
356  """
357 
358  if reference is None:
359  reference = self.reference
360  if stdout is None:
361  stdout = self.out
362  if result is None:
363  result = self.result
364  if causes is None:
365  causes = self.causes
366 
367  reflines = list(filter(None, map(lambda s: s.rstrip(), reference.splitlines())))
368  if not reflines:
369  raise RuntimeError("Empty (or null) reference")
370  # the same on standard output
371  outlines = list(filter(None, map(lambda s: s.rstrip(), stdout.splitlines())))
372 
373  res_field = "GaudiTest.RefBlock"
374  if id:
375  res_field += "_%s" % id
376 
377  if signature is None:
378  if signature_offset < 0:
379  signature_offset = len(reference) + signature_offset
380  signature = reflines[signature_offset]
381  # find the reference block in the output file
382  try:
383  pos = outlines.index(signature)
384  outlines = outlines[
385  pos - signature_offset : pos + len(reflines) - signature_offset
386  ]
387  if reflines != outlines:
388  msg = "standard output"
389  # I do not want 2 messages in causes if the function is called
390  # twice
391  if not msg in causes:
392  causes.append(msg)
393  result[res_field + ".observed"] = result.Quote("\n".join(outlines))
394  except ValueError:
395  causes.append("missing signature")
396  result[res_field + ".signature"] = result.Quote(signature)
397  if len(reflines) > 1 or signature != reflines[0]:
398  result[res_field + ".expected"] = result.Quote("\n".join(reflines))
399  return causes
400 

◆ run()

def GaudiTesting.BaseTest.BaseTest.run (   self)

Definition at line 132 of file BaseTest.py.

132  def run(self):
133  logging.debug("running test %s", self.name)
134 
135  self.result = Result(
136  {
137  "CAUSE": None,
138  "EXCEPTION": None,
139  "RESOURCE": None,
140  "TARGET": None,
141  "TRACEBACK": None,
142  "START_TIME": None,
143  "END_TIME": None,
144  "TIMEOUT_DETAIL": None,
145  }
146  )
147 
148  if self.options:
149  if re.search(
150  r"from\s+Gaudi.Configuration\s+import\s+\*|"
151  "from\s+Configurables\s+import",
152  self.options,
153  ):
154  suffix, lang = ".py", "python"
155  else:
156  suffix, lang = ".opts", "c++"
157  self.result["Options"] = '<code lang="{}"><pre>{}</pre></code>'.format(
158  lang, escape_for_html(self.options)
159  )
160  optionFile = tempfile.NamedTemporaryFile(suffix=suffix)
161  optionFile.file.write(self.options.encode("utf-8"))
162  optionFile.seek(0)
163  self.args.append(RationalizePath(optionFile.name))
164 
165  platform_id = (
166  self.environment.get("BINARY_TAG")
167  or self.environment.get("CMTCONFIG")
168  or platform.platform()
169  )
170  # If at least one regex matches we skip the test.
171  skip_test = bool(
172  [
173  None
174  for prex in self.unsupported_platforms
175  if re.search(prex, platform_id)
176  ]
177  )
178 
179  if not skip_test:
180  # handle working/temporary directory options
181  workdir = self.workdir
182  if self.use_temp_dir:
183  if self._common_tmpdir:
184  workdir = self._common_tmpdir
185  else:
186  workdir = tempfile.mkdtemp()
187 
188  # prepare the command to execute
189  prog = ""
190  if self.program != "":
191  prog = self.program
192  elif "GAUDIEXE" in self.environment:
193  prog = self.environment["GAUDIEXE"]
194  else:
195  prog = "Gaudi.exe"
196 
197  prog_ext = os.path.splitext(prog)[1]
198  if prog_ext not in [".exe", ".py", ".bat"]:
199  prog += ".exe"
200  prog_ext = ".exe"
201 
202  prog = which(prog) or prog
203 
204  args = list(map(RationalizePath, self.args))
205 
206  if prog_ext == ".py":
207  params = ["python", RationalizePath(prog)] + args
208  else:
209  params = [RationalizePath(prog)] + args
210 
211  # we need to switch directory because the validator expects to run
212  # in the same dir as the program
213  os.chdir(workdir)
214 
215  # launching test in a different thread to handle timeout exception
216  def target():
217  logging.debug("executing %r in %s", params, workdir)
218  self.proc = Popen(
219  params, stdout=PIPE, stderr=PIPE, env=self.environment
220  )
221  logging.debug("(pid: %d)", self.proc.pid)
222  out, err = self.proc.communicate()
223  self.out = out.decode("utf-8", errors="backslashreplace")
224  self.err = err.decode("utf-8", errors="backslashreplace")
225 
226  thread = threading.Thread(target=target)
227  thread.start()
228  # catching timeout
229  thread.join(self.timeout)
230 
231  if thread.is_alive():
232  logging.debug("time out in test %s (pid %d)", self.name, self.proc.pid)
233  # get the stack trace of the stuck process
234  cmd = [
235  "gdb",
236  "--pid",
237  str(self.proc.pid),
238  "--batch",
239  "--eval-command=thread apply all backtrace",
240  ]
241  gdb = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
242  self.stack_trace = gdb.communicate()[0].decode(
243  "utf-8", errors="backslashreplace"
244  )
245 
246  kill_tree(self.proc.pid, signal.SIGTERM)
247  thread.join(60)
248  if thread.is_alive():
249  kill_tree(self.proc.pid, signal.SIGKILL)
250  self.causes.append("timeout")
251  else:
252  self.returnedCode = self.proc.returncode
253  if self.returnedCode != SKIP_RETURN_CODE:
254  logging.debug(
255  f"completed test {self.name} with returncode = {self.returnedCode}"
256  )
257  logging.debug("validating test...")
258  self.result, self.causes = self.ValidateOutput(
259  stdout=self.out, stderr=self.err, result=self.result
260  )
261  else:
262  logging.debug(f"skipped test {self.name}")
263  self.status = "skipped"
264 
265  # remove the temporary directory if we created it
266  if self.use_temp_dir and not self._common_tmpdir:
267  shutil.rmtree(workdir, True)
268 
269  os.chdir(self.basedir)
270 
271  if self.status != "skipped":
272  # handle application exit code
273  if self.signal is not None:
274  if int(self.returnedCode) != -int(self.signal):
275  self.causes.append("exit code")
276 
277  elif self.exit_code is not None:
278  if int(self.returnedCode) != int(self.exit_code):
279  self.causes.append("exit code")
280 
281  elif self.returnedCode != 0:
282  self.causes.append("exit code")
283 
284  if self.causes:
285  self.status = "failed"
286  else:
287  self.status = "passed"
288 
289  else:
290  self.status = "skipped"
291 
292  logging.debug("%s: %s", self.name, self.status)
293  field_mapping = {
294  "Exit Code": "returnedCode",
295  "stderr": "err",
296  "Arguments": "args",
297  "Runtime Environment": "environment",
298  "Status": "status",
299  "stdout": "out",
300  "Program Name": "program",
301  "Name": "name",
302  "Validator": "validator",
303  "Output Reference File": "reference",
304  "Error Reference File": "error_reference",
305  "Causes": "causes",
306  # 'Validator Result': 'result.annotations',
307  "Unsupported Platforms": "unsupported_platforms",
308  "Stack Trace": "stack_trace",
309  }
310  resultDict = [
311  (key, getattr(self, attr))
312  for key, attr in field_mapping.items()
313  if getattr(self, attr)
314  ]
315  resultDict.append(
316  (
317  "Working Directory",
318  RationalizePath(os.path.join(os.getcwd(), self.workdir)),
319  )
320  )
321  # print(dict(resultDict).keys())
322  resultDict.extend(self.result.annotations.items())
323  # print(self.result.annotations.keys())
324  resultDict = dict(resultDict)
325 
326  # Special cases
327  if "Validator" in resultDict:
328  resultDict["Validator"] = '<code lang="{}"><pre>{}</pre></code>'.format(
329  "python", escape_for_html(resultDict["Validator"])
330  )
331  return resultDict
332 

◆ ValidateOutput()

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

Reimplemented in GaudiTesting.QMTTest.QMTTest.

Definition at line 337 of file BaseTest.py.

337  def ValidateOutput(self, stdout, stderr, result):
338  if not self.stderr:
339  self.validateWithReference(stdout, stderr, result, self.causes)
340  elif stderr.strip() != self.stderr.strip():
341  self.causes.append("standard error")
342  return result, self.causes
343 

◆ 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 533 of file BaseTest.py.

533  def validateWithReference(
534  self, stdout=None, stderr=None, result=None, causes=None, preproc=None
535  ):
536  """
537  Default validation acti*on: compare standard output and error to the
538  reference files.
539  """
540 
541  if stdout is None:
542  stdout = self.out
543  if stderr is None:
544  stderr = self.err
545  if result is None:
546  result = self.result
547  if causes is None:
548  causes = self.causes
549 
550  # set the default output preprocessor
551  if preproc is None:
552  preproc = normalizeExamples
553  # check standard output
554  lreference = self._expandReferenceFileName(self.reference)
555  # call the validator if the file exists
556  if lreference and os.path.isfile(lreference):
557  causes += ReferenceFileValidator(
558  lreference, "standard output", "Output Diff", preproc=preproc
559  )(stdout, result)
560  elif lreference:
561  causes += ["missing reference file"]
562  # Compare TTree summaries
563  causes = self.CheckTTreesSummaries(stdout, result, causes)
564  causes = self.CheckHistosSummaries(stdout, result, causes)
565  if causes and lreference: # Write a new reference file for stdout
566  try:
567  cnt = 0
568  newrefname = ".".join([lreference, "new"])
569  while os.path.exists(newrefname):
570  cnt += 1
571  newrefname = ".".join([lreference, "~%d~" % cnt, "new"])
572  newref = open(newrefname, "w")
573  # sanitize newlines
574  for l in stdout.splitlines():
575  newref.write(l.rstrip() + "\n")
576  del newref # flush and close
577  result["New Output Reference File"] = os.path.relpath(
578  newrefname, self.basedir
579  )
580  except IOError:
581  # Ignore IO errors when trying to update reference files
582  # because we may be in a read-only filesystem
583  pass
584 
585  # check standard error
586  lreference = self._expandReferenceFileName(self.error_reference)
587  # call the validator if we have a file to use
588  if lreference:
589  if os.path.isfile(lreference):
590  newcauses = ReferenceFileValidator(
591  lreference, "standard error", "Error Diff", preproc=preproc
592  )(stderr, result)
593  else:
594  newcauses = ["missing error reference file"]
595  causes += newcauses
596  if newcauses and lreference: # Write a new reference file for stdedd
597  cnt = 0
598  newrefname = ".".join([lreference, "new"])
599  while os.path.exists(newrefname):
600  cnt += 1
601  newrefname = ".".join([lreference, "~%d~" % cnt, "new"])
602  newref = open(newrefname, "w")
603  # sanitize newlines
604  for l in stderr.splitlines():
605  newref.write(l.rstrip() + "\n")
606  del newref # flush and close
607  result["New Error Reference File"] = os.path.relpath(
608  newrefname, self.basedir
609  )
610  else:
611  causes += BasicOutputValidator(
612  lreference, "standard error", "ExecTest.expected_stderr"
613  )(stderr, result)
614  return causes
615 

Member Data Documentation

◆ _common_tmpdir

GaudiTesting.BaseTest.BaseTest._common_tmpdir = None
staticprivate

Definition at line 104 of file BaseTest.py.

◆ args

GaudiTesting.BaseTest.BaseTest.args

Definition at line 108 of file BaseTest.py.

◆ basedir

GaudiTesting.BaseTest.BaseTest.basedir

Definition at line 130 of file BaseTest.py.

◆ causes

GaudiTesting.BaseTest.BaseTest.causes

Definition at line 123 of file BaseTest.py.

◆ environment

GaudiTesting.BaseTest.BaseTest.environment

Definition at line 115 of file BaseTest.py.

◆ err

GaudiTesting.BaseTest.BaseTest.err

Definition at line 127 of file BaseTest.py.

◆ error_reference

GaudiTesting.BaseTest.BaseTest.error_reference

Definition at line 110 of file BaseTest.py.

◆ exit_code

GaudiTesting.BaseTest.BaseTest.exit_code

Definition at line 114 of file BaseTest.py.

◆ name

GaudiTesting.BaseTest.BaseTest.name

Definition at line 122 of file BaseTest.py.

◆ options

GaudiTesting.BaseTest.BaseTest.options

Definition at line 111 of file BaseTest.py.

◆ out

GaudiTesting.BaseTest.BaseTest.out

Definition at line 126 of file BaseTest.py.

◆ proc

GaudiTesting.BaseTest.BaseTest.proc

Definition at line 128 of file BaseTest.py.

◆ program

GaudiTesting.BaseTest.BaseTest.program

Definition at line 107 of file BaseTest.py.

◆ reference

GaudiTesting.BaseTest.BaseTest.reference

Definition at line 109 of file BaseTest.py.

◆ result

GaudiTesting.BaseTest.BaseTest.result

Definition at line 124 of file BaseTest.py.

◆ returnedCode

GaudiTesting.BaseTest.BaseTest.returnedCode

Definition at line 125 of file BaseTest.py.

◆ signal

GaudiTesting.BaseTest.BaseTest.signal

Definition at line 117 of file BaseTest.py.

◆ stack_trace

GaudiTesting.BaseTest.BaseTest.stack_trace

Definition at line 129 of file BaseTest.py.

◆ status

GaudiTesting.BaseTest.BaseTest.status

Definition at line 121 of file BaseTest.py.

◆ stderr

GaudiTesting.BaseTest.BaseTest.stderr

Definition at line 112 of file BaseTest.py.

◆ timeout

GaudiTesting.BaseTest.BaseTest.timeout

Definition at line 113 of file BaseTest.py.

◆ unsupported_platforms

GaudiTesting.BaseTest.BaseTest.unsupported_platforms

Definition at line 116 of file BaseTest.py.

◆ use_temp_dir

GaudiTesting.BaseTest.BaseTest.use_temp_dir

Definition at line 119 of file BaseTest.py.

◆ workdir

GaudiTesting.BaseTest.BaseTest.workdir

Definition at line 118 of file BaseTest.py.


The documentation for this class was generated from the following file:
GaudiTesting.BaseTest.getCmpFailingValues
def getCmpFailingValues(reference, to_check, fail_path)
Definition: BaseTest.py:1212
GaudiTesting.BaseTest.kill_tree
def kill_tree(ppid, sig)
Definition: BaseTest.py:79
Containers::map
struct GAUDI_API map
Parametrisation class for map-like implementation.
Definition: KeyedObjectManager.h:35
Gaudi::Functional::details::get
auto get(const Handle &handle, const Algo &, const EventContext &) -> decltype(details::deref(handle.get()))
Definition: FunctionalDetails.h:444
GaudiTesting.BaseTest.which
def which(executable)
Definition: BaseTest.py:689
GaudiTesting.BaseTest.cmpTreesDicts
def cmpTreesDicts(reference, to_check, ignore=None)
Definition: BaseTest.py:1179
format
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:119
GaudiTesting.BaseTest.RationalizePath
def RationalizePath(p)
Definition: BaseTest.py:679
hivetimeline.read
def read(f, regex=".*", skipevents=0)
Definition: hivetimeline.py:33
GaudiTesting.BaseTest.findHistosSummaries
def findHistosSummaries(stdout)
Definition: BaseTest.py:1347
GaudiTesting.BaseTest.findTTreeSummaries
def findTTreeSummaries(stdout)
Definition: BaseTest.py:1157
GaudiTesting.BaseTest.GetPlatform
def GetPlatform(self)
Definition: BaseTest.py:1370