◆ _new_backslashreplace_errors()
def GaudiTesting.BaseTest._new_backslashreplace_errors |
( |
|
exc | ) |
|
|
private |
Definition at line 32 of file BaseTest.py.
33 if isinstance(exc, UnicodeDecodeError):
34 code =
hex(ord(exc.object[exc.start]))
35 return (
"\\" + code[1:], exc.start + 1)
37 return backslashreplace_errors(exc)
◆ _parseTTreeSummary()
def GaudiTesting.BaseTest._parseTTreeSummary |
( |
|
lines, |
|
|
|
pos |
|
) |
| |
|
private |
Parse the TTree summary table in lines, starting from pos.
Returns a tuple with the dictionary with the digested informations and the
position of the first line after the summary.
Definition at line 1349 of file BaseTest.py.
1351 Parse the TTree summary table in lines, starting from pos.
1352 Returns a tuple with the dictionary with the digested informations and the
1353 position of the first line after the summary.
1360 return [f.strip()
for f
in l.strip(
"*\n").split(
":", 2)]
1365 cols = splitcols(ll[0])
1369 r[
"Name"], r[
"Title"] = cols[1:]
1374 r[
"Title"] = ll[1].strip(
"*\n").split(
"|")[1].strip()
1378 cols = splitcols(ll[1 + delta_i])
1379 r[
"Entries"] = int(cols[1])
1381 sizes = cols[2].split()
1382 r[
"Total size"] = int(sizes[2])
1383 if sizes[-1] ==
"memory":
1386 r[
"File size"] = int(sizes[-1])
1388 cols = splitcols(ll[2 + delta_i])
1389 sizes = cols[2].split()
1390 if cols[0] ==
"Baskets":
1391 r[
"Baskets"] = int(cols[1])
1392 r[
"Basket size"] = int(sizes[2])
1393 r[
"Compression"] = float(sizes[-1])
1397 def nextblock(lines, i):
1399 dots = re.compile(
r"^\.+$")
1400 stars = re.compile(
r"^\*+$")
1404 and not dots.match(lines[i + delta_i][1:-1])
1405 and not stars.match(lines[i + delta_i])
1410 if i < (count - 3)
and lines[i].startswith(
"*Tree"):
1411 i_nextblock = nextblock(lines, i)
1412 result = parseblock(lines[i:i_nextblock])
1413 result[
"Branches"] = {}
1415 while i < (count - 3)
and lines[i].startswith(
"*Br"):
1416 if i < (count - 2)
and lines[i].startswith(
"*Branch "):
1420 i_nextblock = nextblock(lines, i)
1421 if i_nextblock >= count:
1423 branch = parseblock(lines[i:i_nextblock])
1424 result[
"Branches"][branch[
"Name"]] = branch
◆ cmpTreesDicts()
def GaudiTesting.BaseTest.cmpTreesDicts |
( |
|
reference, |
|
|
|
to_check, |
|
|
|
ignore = None |
|
) |
| |
Check that all the keys in reference are in to_check too, with the same value.
If the value is a dict, the function is called recursively. to_check can
contain more keys than reference, that will not be tested.
The function returns at the first difference found.
Definition at line 1301 of file BaseTest.py.
1303 Check that all the keys in reference are in to_check too, with the same value.
1304 If the value is a dict, the function is called recursively. to_check can
1305 contain more keys than reference, that will not be tested.
1306 The function returns at the first difference found.
1311 ignore_re = re.compile(ignore)
1312 keys = [key
for key
in reference
if not ignore_re.match(key)]
1314 keys = reference.keys()
1318 if isinstance(reference[k], dict)
and isinstance(to_check[k], dict):
1321 failed = fail_keys =
cmpTreesDicts(reference[k], to_check[k], ignore)
1324 failed = to_check[k] != reference[k]
1329 fail_keys.insert(0, k)
◆ dumpProcs()
def GaudiTesting.BaseTest.dumpProcs |
( |
|
name | ) |
|
helper to debug GAUDI-1084, dump the list of processes
Definition at line 67 of file BaseTest.py.
68 """helper to debug GAUDI-1084, dump the list of processes"""
69 from getpass
import getuser
71 if "WORKSPACE" in os.environ:
72 p = Popen([
"ps",
"-fH",
"-U", getuser()], stdout=PIPE)
73 with open(os.path.join(os.environ[
"WORKSPACE"], name),
"wb")
as f:
74 f.write(p.communicate()[0])
◆ findHistosSummaries()
def GaudiTesting.BaseTest.findHistosSummaries |
( |
|
stdout | ) |
|
Scan stdout to find ROOT TTree summaries and digest them.
Definition at line 1498 of file BaseTest.py.
1500 Scan stdout to find ROOT TTree summaries and digest them.
1502 outlines = stdout.splitlines()
1503 nlines = len(outlines) - 1
1511 match = h_count_re.search(outlines[pos])
1512 while pos < nlines
and not match:
1514 match = h_count_re.search(outlines[pos])
1517 summaries.update(summ)
◆ findTTreeSummaries()
def GaudiTesting.BaseTest.findTTreeSummaries |
( |
|
stdout | ) |
|
Scan stdout to find ROOT TTree summaries and digest them.
Definition at line 1279 of file BaseTest.py.
1281 Scan stdout to find ROOT TTree summaries and digest them.
1283 stars = re.compile(
r"^\*+$")
1284 outlines = stdout.splitlines()
1285 nlines = len(outlines)
1291 while i < nlines
and not stars.match(outlines[i]):
1296 trees[tree[
"Name"]] = tree
◆ getCmpFailingValues()
def GaudiTesting.BaseTest.getCmpFailingValues |
( |
|
reference, |
|
|
|
to_check, |
|
|
|
fail_path |
|
) |
| |
Definition at line 1334 of file BaseTest.py.
1340 if c
is None or r
is None:
1342 return (fail_path, r, c)
◆ GetPlatform()
def GaudiTesting.BaseTest.GetPlatform |
( |
|
self | ) |
|
Return the platform Id defined in CMTCONFIG or SCRAM_ARCH.
Definition at line 1521 of file BaseTest.py.
1523 Return the platform Id defined in CMTCONFIG or SCRAM_ARCH.
1527 if "BINARY_TAG" in os.environ:
1528 arch = os.environ[
"BINARY_TAG"]
1529 elif "CMTCONFIG" in os.environ:
1530 arch = os.environ[
"CMTCONFIG"]
1531 elif "SCRAM_ARCH" in os.environ:
1532 arch = os.environ[
"SCRAM_ARCH"]
1533 elif os.environ.get(
"ENV_CMAKE_BUILD_TYPE",
"")
in (
1539 elif os.environ.get(
"ENV_CMAKE_BUILD_TYPE",
"")
in (
◆ isWinPlatform()
def GaudiTesting.BaseTest.isWinPlatform |
( |
|
self | ) |
|
Return True if the current platform is Windows.
This function was needed because of the change in the CMTCONFIG format,
from win32_vc71_dbg to i686-winxp-vc9-dbg.
Definition at line 1549 of file BaseTest.py.
1551 Return True if the current platform is Windows.
1553 This function was needed because of the change in the CMTCONFIG format,
1554 from win32_vc71_dbg to i686-winxp-vc9-dbg.
1557 return "winxp" in platform
or platform.startswith(
"win")
◆ kill_tree()
def GaudiTesting.BaseTest.kill_tree |
( |
|
ppid, |
|
|
|
sig |
|
) |
| |
Send a signal to a process and all its child processes (starting from the
leaves).
Definition at line 77 of file BaseTest.py.
79 Send a signal to a process and all its child processes (starting from the
82 log = logging.getLogger(
"kill_tree")
83 ps_cmd = [
"ps",
"--no-headers",
"-o",
"pid",
"--ppid", str(ppid)]
86 get_children = Popen(ps_cmd, stdout=PIPE, stderr=PIPE, env={})
87 children =
map(int, get_children.communicate()[0].split())
88 for child
in children:
91 log.debug(
"killing process %d", ppid)
93 except OSError
as err:
96 log.debug(
"no such process %d", ppid)
◆ parseHistosSummary()
def GaudiTesting.BaseTest.parseHistosSummary |
( |
|
lines, |
|
|
|
pos |
|
) |
| |
Extract the histograms infos from the lines starting at pos.
Returns the position of the first line after the summary block.
Definition at line 1430 of file BaseTest.py.
1432 Extract the histograms infos from the lines starting at pos.
1433 Returns the position of the first line after the summary block.
1436 h_table_head = re.compile(
1437 r'(?:INFO|SUCCESS)\s+(1D|2D|3D|1D profile|2D profile|3d profile) histograms in directory\s+"(\w*)"'
1439 h_short_summ = re.compile(
r"ID=([^\"]+)\s+\"([^\"]*)\"\s+(.*)")
1444 m = h_count_re.search(lines[pos])
1445 name = m.group(1).strip()
1446 total = int(m.group(2))
1448 for k, v
in [x.split(
"=")
for x
in m.group(3).split()]:
1451 header[
"Total"] = total
1455 m = h_table_head.search(lines[pos])
1458 t = t.replace(
" profile",
"Prof")
1465 if l.startswith(
" | ID"):
1467 titles = [x.strip()
for x
in l.split(
"|")][1:]
1469 while pos < nlines
and lines[pos].startswith(
" |"):
1471 values = [x.strip()
for x
in l.split(
"|")][1:]
1473 for i
in range(len(titles)):
1474 hcont[titles[i]] = values[i]
1475 cont[hcont[
"ID"]] = hcont
1477 elif l.startswith(
" ID="):
1478 while pos < nlines
and lines[pos].startswith(
" ID="):
1480 x.strip()
for x
in h_short_summ.search(lines[pos]).groups()
1482 cont[values[0]] = values
1485 raise RuntimeError(
"Cannot understand line %d: '%s'" % (pos, l))
1489 summ[d][
"header"] = header
1494 summ[name] = {
"header": header}
◆ RationalizePath()
def GaudiTesting.BaseTest.RationalizePath |
( |
|
p | ) |
|
Function used to normalize the used path
Definition at line 781 of file BaseTest.py.
783 Function used to normalize the used path
785 p = os.path.expandvars(p)
790 p, suffix = p.rsplit(
":", 1)
791 suffix = f
":{suffix}"
793 if os.path.exists(p):
794 p = os.path.realpath(p)
◆ ROOT6WorkAroundEnabled()
def GaudiTesting.BaseTest.ROOT6WorkAroundEnabled |
( |
|
id = None | ) |
|
◆ sanitize_for_xml()
def GaudiTesting.BaseTest.sanitize_for_xml |
( |
|
data | ) |
|
Take a string with invalid ASCII/UTF characters and quote them so that the
string can be used in an XML text.
>>> sanitize_for_xml('this is \x1b')
'this is [NON-XML-CHAR-0x1B]'
Definition at line 50 of file BaseTest.py.
52 Take a string with invalid ASCII/UTF characters and quote them so that the
53 string can be used in an XML text.
55 >>> sanitize_for_xml('this is \x1b')
56 'this is [NON-XML-CHAR-0x1B]'
58 bad_chars = re.compile(
"[\x00-\x08\x0b\x0c\x0e-\x1f\ud800-\udfff\ufffe\uffff]")
62 return "".join(
"[NON-XML-CHAR-0x%2X]" % ord(c)
for c
in match.group())
64 return bad_chars.sub(quote, data)
◆ which()
def GaudiTesting.BaseTest.which |
( |
|
executable | ) |
|
Locates an executable in the executables path ($PATH) and returns the full
path to it. An application is looked for with or without the '.exe' suffix.
If the executable cannot be found, None is returned
Definition at line 798 of file BaseTest.py.
798 def which(executable):
800 Locates an executable in the executables path ($PATH) and returns the full
801 path to it. An application is looked for with or without the '.exe' suffix.
802 If the executable cannot be found, None is returned
804 if os.path.isabs(executable):
805 if not os.path.isfile(executable):
806 if executable.endswith(
".exe"):
807 if os.path.isfile(executable[:-4]):
808 return executable[:-4]
810 executable = os.path.split(executable)[1]
813 for d
in os.environ.get(
"PATH").split(os.pathsep):
814 fullpath = os.path.join(d, executable)
815 if os.path.isfile(fullpath):
817 elif executable.endswith(
".exe")
and os.path.isfile(fullpath[:-4]):
◆ __processLine__
GaudiTesting.BaseTest.__processLine__ |
|
private |
◆ h_count_re
GaudiTesting.BaseTest.h_count_re |
◆ lineSkipper
GaudiTesting.BaseTest.lineSkipper |
◆ maskPointers
GaudiTesting.BaseTest.maskPointers |
◆ normalizeDate
GaudiTesting.BaseTest.normalizeDate |
◆ normalizeEOL
GaudiTesting.BaseTest.normalizeEOL |
◆ normalizeExamples
GaudiTesting.BaseTest.normalizeExamples |
◆ normalizeTestSuite
GaudiTesting.BaseTest.normalizeTestSuite |
◆ OUTPUT_LIMIT
GaudiTesting.BaseTest.OUTPUT_LIMIT |
◆ regexps
list GaudiTesting.BaseTest.regexps |
◆ SKIP_RETURN_CODE
GaudiTesting.BaseTest.SKIP_RETURN_CODE |
◆ skipEmptyLines
GaudiTesting.BaseTest.skipEmptyLines |
MsgStream & hex(MsgStream &log)
def _parseTTreeSummary(lines, pos)
def sanitize_for_xml(data)
def getCmpFailingValues(reference, to_check, fail_path)
def _new_backslashreplace_errors(exc)
struct GAUDI_API map
Parametrisation class for map-like implementation.
def parseHistosSummary(lines, pos)
def cmpTreesDicts(reference, to_check, ignore=None)
def findHistosSummaries(stdout)
def findTTreeSummaries(stdout)
def ROOT6WorkAroundEnabled(id=None)
decltype(auto) range(Args &&... args)
Zips multiple containers together to form a single range.