| # 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() |