| import os |
| import sys |
| import sysconfig |
| import unittest |
| |
| try: |
| from _testinternalcapi import perf_map_state_teardown, write_perf_map_entry |
| except ImportError: |
| raise unittest.SkipTest("requires _testinternalcapi") |
| |
| def supports_trampoline_profiling(): |
| perf_trampoline = sysconfig.get_config_var("PY_HAVE_PERF_TRAMPOLINE") |
| if not perf_trampoline: |
| return False |
| return int(perf_trampoline) == 1 |
| |
| if not supports_trampoline_profiling(): |
| raise unittest.SkipTest("perf trampoline profiling not supported") |
| |
| class TestPerfMapWriting(unittest.TestCase): |
| def tearDown(self): |
| perf_map_state_teardown() |
| |
| def test_write_perf_map_entry(self): |
| self.assertEqual(write_perf_map_entry(0x1234, 5678, "entry1"), 0) |
| self.assertEqual(write_perf_map_entry(0x2345, 6789, "entry2"), 0) |
| with open(f"/tmp/perf-{os.getpid()}.map") as f: |
| perf_file_contents = f.read() |
| self.assertIn("1234 162e entry1", perf_file_contents) |
| self.assertIn("2345 1a85 entry2", perf_file_contents) |
| |
| @unittest.skipIf(sys.maxsize <= 2**32, "requires size_t wider than unsigned int") |
| def test_write_perf_map_entry_large_size(self): |
| code_addr = 0x3456 |
| code_size = 1 << 33 |
| entry_name = "entry_big" |
| |
| self.assertEqual(write_perf_map_entry(code_addr, code_size, entry_name), 0) |
| with open(f"/tmp/perf-{os.getpid()}.map") as f: |
| perf_file_contents = f.read() |
| self.assertIn(f"{code_addr:x} {code_size:x} {entry_name}", |
| perf_file_contents) |