Skip to content

Commit aa89948

Browse files
committed
Expand gold testing
1 parent dbe5c21 commit aa89948

File tree

7 files changed

+9749
-613
lines changed

7 files changed

+9749
-613
lines changed

python/TestHarness/resultsstore/resultcollection.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ def _get_tests(
230230

231231
if test_id := doc.get("test_id"):
232232
doc["_id"] = test_id
233+
del doc["test_id"]
233234

234235
result = next(result_it)
235236
assert result.id == id

python/TestHarness/resultsstore/storedtestresult.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
)
2323
from TestHarness.resultsstore.utils import (
2424
TestName,
25+
compress_dict,
2526
decompress_dict,
2627
get_typed,
2728
)
@@ -379,3 +380,62 @@ def get_perf_graph(self) -> Optional[dict]:
379380
Requires filter TestDataFilter.TESTER when loading tests.
380381
"""
381382
return get_typed(self.get_json_metadata(), "perf_graph", (NoneType, dict))
383+
384+
def serialize(self) -> dict:
385+
"""
386+
Serialize the data so that it is JSON dumpable.
387+
388+
Can be reloaded with deserialize().
389+
"""
390+
data = deepcopy(self.data)
391+
392+
data["serialized"] = {
393+
"folder_name": self.folder_name,
394+
"test_name": self.test_name,
395+
"data_filters": [v.name for v in self._data_filters],
396+
}
397+
398+
# Convert ObjectID to string ID
399+
for key in ["_id", "result_id"]:
400+
if value := data.get(key):
401+
data[key] = str(value)
402+
403+
# Convert binary JSON metadata to dict
404+
if json_metadata := self.get_json_metadata():
405+
data["tester"]["json_metadata"] = json_metadata
406+
407+
# Time entry if it exists
408+
if (time := data.get("time")) is not None:
409+
data["time"] = str(time)
410+
411+
return data
412+
413+
@staticmethod
414+
def deserialize(data: dict, result: StoredResult) -> "StoredTestResult":
415+
"""Deserialize data from serialize() into a test result."""
416+
assert isinstance(data, dict)
417+
assert isinstance(result, StoredResult)
418+
419+
serialized = data["serialized"]
420+
name = TestName(serialized["folder_name"], serialized["test_name"])
421+
filters = [TestDataFilter[v] for v in serialized["data_filters"]]
422+
del data["serialized"]
423+
424+
# Convert string ID to ObjectID
425+
for key in ["_id", "result_id"]:
426+
if value := data.get(key):
427+
data[key] = ObjectId(value)
428+
429+
# Convert JSON metadata back to binary
430+
tester = data.get("tester", {})
431+
json_metadata = tester.get("json_metadata")
432+
if json_metadata:
433+
data["tester"]["json_metadata"] = {
434+
k: compress_dict(v) for k, v in json_metadata.items()
435+
}
436+
437+
# Convert time to datettime
438+
if (time := data.get("time")) is not None:
439+
data["time"] = datetime.fromisoformat(time)
440+
441+
return StoredTestResult(data, name, result, filters)

python/TestHarness/tests/resultsstore/common.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,8 @@ class GoldResult:
280280
event_sha: str
281281
# The event ID for the result (if any)
282282
event_id: Optional[int] = None
283+
# The ID for the test, if stored separately
284+
test_id: Optional[ObjectId] = None
283285

284286

285287
# Static set of results from which to build the gold file

0 commit comments

Comments
 (0)