blob: efca023eb10db60e6c902517e2a401104bd363b6 [file] [log] [blame]
# Copyright 2024 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import json
import tempfile
import unittest
import debug_json
class DebugJsonTest(unittest.TestCase):
def test_parse(self) -> None:
json_data = dict(
Capture=dict(
Time=1,
Processes=[["koid", "name", "vmos"], [2, "p2", [2]]],
Kernel=dict(
total=2,
free=2,
wired=2,
total_heap=2,
free_heap=2,
vmo=2,
mmu=2,
ipc=2,
other=2,
vmo_pager_total=2,
vmo_pager_newest=2,
vmo_pager_oldest=2,
vmo_discardable_locked=2,
vmo_discardable_unlocked=2,
vmo_reclaim_disabled=2,
),
VmoNames=["", "Vmo1"],
Vmos=[
[
"koid",
"name",
"parent_koid",
"committed_bytes",
"allocated_bytes",
"populated_bytes",
],
[1, 1, 0, 1024, 2048, 4096],
[2, 0, 1, 2048, 4096, 8192],
[3, 0, 2, 4096, 8192, 16384],
],
kmem_stats_compression=dict(
uncompressed_storage_bytes=3,
compressed_storage_bytes=3,
compressed_fragmentation_bytes=3,
compression_time=3,
decompression_time=3,
total_page_compression_attempts=3,
failed_page_compression_attempts=3,
total_page_decompressions=3,
compressed_page_evictions=3,
eager_page_compressions=3,
memory_pressure_page_compressions=3,
critical_memory_page_compressions=3,
pages_decompressed_unit_ns=3,
pages_decompressed_within_log_time=[1, 2, 3, 4, 5],
),
),
Buckets=[dict(event_code=1, name="b1", process="p1", vmo="v1")],
)
with tempfile.NamedTemporaryFile("wt") as tf:
json.dump(json_data, tf)
tf.flush()
data = debug_json.parse(tf.name)
import pprint
pprint.pprint(data)
vmo1, vmo2, vmo3 = data.capture.vmos
(p2,) = data.capture.processes
self.assertEqual(
vmo1,
debug_json.VMO(
koid=1,
name_index=1,
parent_koid=0,
committed_bytes=1024,
allocated_bytes=2048,
populated_bytes=4096,
),
)
self.assertEqual(vmo1.name, "Vmo1")
self.assertEqual(vmo1.name_or_ancestor_name, "Vmo1")
self.assertEqual(vmo1.parent, None)
self.assertEqual(vmo1.processes, [])
self.assertEqual(list(vmo1.children), [vmo2])
self.assertEqual(list(vmo1.descendants()), [vmo2, vmo3])
self.assertEqual(list(vmo1.ancestors), [])
self.assertEqual(vmo2.name, "")
self.assertEqual(vmo2.name_or_ancestor_name, "Vmo1")
self.assertEqual(vmo2.parent, vmo1)
self.assertEqual(vmo2.processes, [p2])
self.assertEqual(list(vmo2.children), [vmo3])
self.assertEqual(list(vmo2.descendants()), [vmo3])
self.assertEqual(list(vmo2.ancestors), [vmo1])
self.assertEqual(vmo3.name, "")
self.assertEqual(vmo3.name_or_ancestor_name, "Vmo1")
self.assertEqual(vmo3.parent, vmo2)
self.assertEqual(vmo3.processes, [])
self.assertEqual(list(vmo3.children), [])
self.assertEqual(list(vmo3.descendants()), [])
self.assertEqual(list(vmo3.ancestors), [vmo2, vmo1])
self.assertEqual(
p2,
debug_json.Process(koid=2, name="p2", vmos_koid=[2]),
)
self.assertEqual(p2.vmos, (vmo2,))
self.assertEqual(p2.vmos_and_their_ancestors, (vmo1, vmo2))
self.assertEqual(data.capture.vmos_by_name[""], [vmo2, vmo3])
self.assertEqual(data.capture.vmos_by_name["Vmo1"], [vmo1])
self.assertEqual(data.capture.process_by_koid[2], p2)
self.assertEqual(data.capture.vmo_by_koid[1], vmo1)
if __name__ == "__main__":
unittest.main()