reserved=0
Signed-off-by: Daniel Turull <[email protected]>
Assisted-by: Claude, Anthropic
---
meta/lib/oeqa/runtime/cases/ltp.py | 16 ++++++-------
meta/lib/oeqa/runtime/cases/ltp_stress.py | 16 +++++++++----
meta/lib/oeqa/utils/logparser.py | 29
+++++++++++++++++++++++
meta/recipes-extended/ltp/ltp_20260130.bb | 1 +
4 files changed, 50 insertions(+), 12 deletions(-)
diff --git a/meta/lib/oeqa/runtime/cases/ltp.py
b/meta/lib/oeqa/runtime/cases/ltp.py
index 0ffdbe23e4..11c4814090 100644
--- a/meta/lib/oeqa/runtime/cases/ltp.py
+++ b/meta/lib/oeqa/runtime/cases/ltp.py
@@ -12,7 +12,7 @@ import pprint
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage -from
oeqa.utils.logparser import LtpParser
+from oeqa.utils.logparser import LtpKirkParser
class LtpTestBase(OERuntimeTestCase):
@@ -66,9 +66,9 @@ class LtpTest(LtpTestBase):
def runltp(self, ltp_group):
# LTP appends to log files, so ensure we start with a
clean log
- self.target.deleteFiles("/opt/ltp/results/", ltp_group)
+ self.target.deleteFiles("/opt/ltp/results/", "%s.json" %
+ltp_group)
- cmd = '/opt/ltp/runltp -f %s -q -r /opt/ltp -l
/opt/ltp/results/%s -I 1 -d /opt/ltp' % (ltp_group, ltp_group)
+ cmd = 'kirk --run-suite %s --json-report
+/opt/ltp/results/%s.json -n' % (ltp_group, ltp_group)
starttime = time.time()
(status, output) = self.target.run(cmd, timeout=1200) @@
-87,14 +87,14 @@ class LtpTest(LtpTestBase):
self.extras['ltpresult.rawlogs']['log'] =
self.extras['ltpresult.rawlogs']['log'] + output
# Copy the machine-readable test results locally so we
can parse it
- dst = os.path.join(self.ltptest_log_dir, ltp_group)
- remote_src = "/opt/ltp/results/%s" % ltp_group
+ dst = os.path.join(self.ltptest_log_dir, "%s.json" %
+ltp_group)
+ remote_src = "/opt/ltp/results/%s.json" % ltp_group
(status, output) = self.target.copyFrom(remote_src, dst,
True)
if status:
msg = 'File could not be copied. Output: %s' % output
self.target.logger.warning(msg)
- parser = LtpParser()
+ parser = LtpKirkParser()
results, sections = parser.parse(dst)
sections['duration'] = int(endtime-starttime) @@ -113,9
+113,9 @@ class LtpTest(LtpTestBase):
# LTP runtime tests
@OETestDepends(['ssh.SSHTest.test_ssh'])
- @OEHasPackage(["ltp"])
+ @OEHasPackage(["ltp", "python3-kirk"])
def test_ltp_help(self):
- (status, output) = self.target.run('/opt/ltp/runltp --help')
+ (status, output) = self.target.run('kirk --help')
msg = 'Failed to get ltp help. Output: %s' % output
self.assertEqual(status, 0, msg=msg)
diff --git a/meta/lib/oeqa/runtime/cases/ltp_stress.py
b/meta/lib/oeqa/runtime/cases/ltp_stress.py
index ce6f4bf59d..cf84ec1182 100644
--- a/meta/lib/oeqa/runtime/cases/ltp_stress.py
+++ b/meta/lib/oeqa/runtime/cases/ltp_stress.py
@@ -13,7 +13,7 @@ from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
from oeqa.core.decorator.data import skipIfQemu -from
oeqa.utils.logparser import LtpParser
+from oeqa.utils.logparser import LtpKirkParser
class LtpStressBase(OERuntimeTestCase):
@@ -60,7 +60,7 @@ class LtpStressBase(OERuntimeTestCase):
class LtpStressTest(LtpStressBase):
def runltp(self, stress_group):
- cmd = '/opt/ltp/runltp -f %s -p -q 2>@1 | tee
/opt/ltp/results/%s' % (stress_group, stress_group)
+ cmd = 'kirk --run-suite %s --json-report
+/opt/ltp/results/%s.json -n' % (stress_group, stress_group)
starttime = time.time()
(status, output) = self.target.run(cmd)
endtime = time.time()
@@ -69,8 +69,16 @@ class LtpStressTest(LtpStressBase):
self.extras['ltpstressresult.rawlogs']['log'] =
self.extras['ltpstressresult.rawlogs']['log'] + output
- parser = LtpParser()
- results, sections =
parser.parse(os.path.join(self.ltptest_log_dir, "%s" % stress_group))
+ # Copy kirk JSON report from target
+ dst = os.path.join(self.ltptest_log_dir, "%s.json" %
+stress_group)
+ remote_src = "/opt/ltp/results/%s.json" % stress_group
+ (status, output) = self.target.copyFrom(remote_src, dst,
+True)
+ if status:
+ msg = 'File could not be copied. Output: %s' % output
+ self.target.logger.warning(msg)
+
+ parser = LtpKirkParser()
+ results, sections = parser.parse(dst)
runtime = int(endtime-starttime)
sections['duration'] = runtime diff --git
a/meta/lib/oeqa/utils/logparser.py b/meta/lib/oeqa/utils/logparser.py
index c479864162..a907421fab 100644
--- a/meta/lib/oeqa/utils/logparser.py
+++ b/meta/lib/oeqa/utils/logparser.py
@@ -5,6 +5,7 @@
#
import enum
+import json
import os
import re
@@ -158,6 +159,34 @@ class LtpParser:
return results, section
+class LtpKirkParser:
+ """Parse kirk JSON report into the same format as LtpParser."""
+
+ STATUS_MAP = {
+ "pass": "PASSED",
+ "fail": "FAILED",
+ "brok": "FAILED",
+ "conf": "SKIPPED",
+ "warn": "PASSED",
+ }
+
+ def parse(self, jsonfile):
+ with open(jsonfile, errors="replace") as f:
+ report = json.load(f)
+
+ results = {}
+ section = {"duration": 0, "log": ""}
+
+ for entry in report.get("results", []):
+ results[entry["test_fqn"]] =
+self.STATUS_MAP.get(entry.get("status", ""), "FAILED")
+ test = entry.get("test", {})
+ section["log"] += test.get("log", "")
+
+ section["duration"] = int(report.get("stats",
+{}).get("runtime", 0))
+
+ return results, section
+
+