1
0
mirror of https://git.yoctoproject.org/poky synced 2026-04-20 23:39:22 +00:00

oeqa/core/case.py: Add OEPTestResultTestCase for ptestresult helpers

Add the OEPTestResultTestCase class as a mix-in class to provide helper
functions for interacting with ptestresults within the extraresults
object generated by the test case.

This class also provides default compression of log text and log files.

Also add support to resulttool for decoding/decompressing log files
embedded in the test results.

(From OE-Core rev: 06cba9883a5964320969301fd05eeb6bec3e786d)

Signed-off-by: Nathan Rossi <nathan@nathanrossi.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Nathan Rossi
2019-09-11 14:13:07 +00:00
committed by Richard Purdie
parent 0c19c09335
commit e08f657220
3 changed files with 108 additions and 27 deletions

View File

@@ -8,12 +8,12 @@ import os
import resulttool.resultutils as resultutils
def show_ptest(result, ptest, logger):
if 'ptestresult.sections' in result:
if ptest in result['ptestresult.sections'] and 'log' in result['ptestresult.sections'][ptest]:
print(result['ptestresult.sections'][ptest]['log'])
return 0
logdata = resultutils.ptestresult_get_log(result, ptest)
if logdata is not None:
print(logdata)
return 0
print("ptest '%s' not found" % ptest)
print("ptest '%s' log not found" % ptest)
return 1
def show_reproducible(result, reproducible, logger):
@@ -25,7 +25,6 @@ def show_reproducible(result, reproducible, logger):
print("reproducible '%s' not found" % reproducible)
return 1
def log(args, logger):
results = resultutils.load_resultsdata(args.source)
@@ -35,24 +34,24 @@ def log(args, logger):
return 1
for _, run_name, _, r in resultutils.test_run_results(results):
if args.dump_ptest:
if 'ptestresult.sections' in r:
for name, ptest in r['ptestresult.sections'].items():
if 'log' in ptest:
dest_dir = args.dump_ptest
if args.prepend_run:
dest_dir = os.path.join(dest_dir, run_name)
if args.dump_ptest and 'ptestresult.sections' in r:
for name, ptest in r['ptestresult.sections'].items():
logdata = resultutils.ptestresult_get_log(r, name)
if logdata is not None:
dest_dir = args.dump_ptest
if args.prepend_run:
dest_dir = os.path.join(dest_dir, run_name)
os.makedirs(dest_dir, exist_ok=True)
dest = os.path.join(dest_dir, '%s.log' % name)
print(dest)
with open(dest, 'w') as f:
f.write(ptest['log'])
os.makedirs(dest_dir, exist_ok=True)
dest = os.path.join(dest_dir, '%s.log' % name)
print(dest)
with open(dest, 'w') as f:
f.write(logdata)
if args.raw_ptest:
if 'ptestresult.rawlogs' in r:
print(r['ptestresult.rawlogs']['log'])
rawlog = resultutils.ptestresult_get_rawlogs(r)
if rawlog is not None:
print(rawlog)
else:
print('Raw ptest logs not found')
return 1

View File

@@ -7,6 +7,8 @@
#
import os
import base64
import zlib
import json
import scriptpath
import copy
@@ -117,6 +119,34 @@ def strip_ptestresults(results):
del newresults[res]['result']['ptestresult.sections'][i]['log']
return newresults
def decode_log(logdata):
if isinstance(logdata, str):
return logdata
elif isinstance(logdata, dict):
if "compressed" in logdata:
data = logdata.get("compressed")
data = base64.b64decode(data.encode("utf-8"))
return zlib.decompress(data).decode("utf-8")
return None
def ptestresult_get_log(results, section):
if 'ptestresult.sections' not in results:
return None
if section not in results['ptestresult.sections']:
return None
ptest = results['ptestresult.sections'][section]
if 'log' not in ptest:
return None
return decode_log(ptest['log'])
def ptestresult_get_rawlogs(results):
if 'ptestresult.rawlogs' not in results:
return None
if 'log' not in results['ptestresult.rawlogs']:
return None
return decode_log(results['ptestresult.rawlogs']['log'])
def save_resultsdata(results, destdir, fn="testresults.json", ptestjson=False, ptestlogs=False):
for res in results:
if res:
@@ -131,14 +161,17 @@ def save_resultsdata(results, destdir, fn="testresults.json", ptestjson=False, p
f.write(json.dumps(resultsout, sort_keys=True, indent=4))
for res2 in results[res]:
if ptestlogs and 'result' in results[res][res2]:
if 'ptestresult.rawlogs' in results[res][res2]['result']:
seriesresults = results[res][res2]['result']
rawlogs = ptestresult_get_rawlogs(seriesresults)
if rawlogs is not None:
with open(dst.replace(fn, "ptest-raw.log"), "w+") as f:
f.write(results[res][res2]['result']['ptestresult.rawlogs']['log'])
if 'ptestresult.sections' in results[res][res2]['result']:
for i in results[res][res2]['result']['ptestresult.sections']:
if 'log' in results[res][res2]['result']['ptestresult.sections'][i]:
f.write(rawlogs)
if 'ptestresult.sections' in seriesresults:
for i in seriesresults['ptestresult.sections']:
sectionlog = ptestresult_get_log(seriesresults, i)
if sectionlog is not None:
with open(dst.replace(fn, "ptest-%s.log" % i), "w+") as f:
f.write(results[res][res2]['result']['ptestresult.sections'][i]['log'])
f.write(sectionlog)
def git_get_result(repo, tags):
git_objs = []