summaryrefslogtreecommitdiffstats
path: root/js/src/tests/lib/structuredlog.py
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/lib/structuredlog.py')
-rw-r--r--js/src/tests/lib/structuredlog.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/js/src/tests/lib/structuredlog.py b/js/src/tests/lib/structuredlog.py
new file mode 100644
index 0000000000..2f2d317d02
--- /dev/null
+++ b/js/src/tests/lib/structuredlog.py
@@ -0,0 +1,56 @@
+# produce mozlog-compatible log messages, following the spec at
+# https://mozbase.readthedocs.io/en/latest/mozlog.html
+
+import json
+import os
+from time import time
+
+
+class TestLogger(object):
+ def __init__(self, source, threadname="main"):
+ self.template = {
+ "source": source,
+ "thread": threadname,
+ "pid": os.getpid(),
+ }
+ directory = os.environ.get("MOZ_UPLOAD_DIR", ".")
+ self.fh = open(os.path.join(directory, threadname + "_raw.log"), "a")
+
+ def _record(self, **kwargs):
+ record = self.template.copy()
+ record.update(**kwargs)
+ if "time" not in record:
+ record["time"] = time()
+ return record
+
+ def _log_obj(self, obj):
+ print(json.dumps(obj, sort_keys=True), file=self.fh)
+
+ def _log(self, **kwargs):
+ self._log_obj(self._record(**kwargs))
+
+ def suite_start(self):
+ self._log(action="suite_start", tests=[])
+
+ def suite_end(self):
+ self._log(action="suite_end")
+
+ def test_start(self, testname):
+ self._log(action="test_start", test=testname)
+
+ def test_end(self, testname, status):
+ self._log(action="test_end", test=testname, status=status)
+
+ def test(self, testname, status, duration, **details):
+ record = self._record(
+ action="test_start", test=testname, **details.get("extra", {})
+ )
+ end_time = record["time"]
+ record["time"] -= duration
+ self._log_obj(record)
+
+ record["action"] = "test_end"
+ record["time"] = end_time
+ record["status"] = status
+ record.update(**details)
+ self._log_obj(record)