#!/usr/bin/env python3 # Copyright 2022 The Pigweed Authors # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. """Tests for bloaty configuration tooling.""" import unittest from pw_bloat import bloaty_config class BloatyConfigTest(unittest.TestCase): """Tests that the bloaty config tool produces the expected config.""" def test_map_segments_to_memory_regions(self) -> None: """Ensures the mapping works correctly based on a real example.""" segments = { 3: (int(0x800f268), int(0x8100200)), 5: (int(0x20004650), int(0x20020650)), 6: (int(0x20020650), int(0x20030000)), 1: (int(0x8000200), int(0x800f060)), 4: (int(0x20000208), int(0x20004650)), 2: (int(0x20000000), int(0x20000208)), 0: (int(0x8000000), int(0x8000200)), } memory_regions = { 'FLASH': { 0: (int(0x8000200), int(0x8100200)) }, 'RAM': { 0: (int(0x20000000), int(0x20030000)) }, 'VECTOR_TABLE': { 0: (int(0x8000000), int(0x8000200)) }, } expected = { 3: 'FLASH', 5: 'RAM', 6: 'RAM', 1: 'FLASH', 4: 'RAM', 2: 'RAM', 0: 'VECTOR_TABLE', } actual = bloaty_config.map_segments_to_memory_regions( segments=segments, memory_regions=memory_regions) self.assertEqual(expected, actual) def test_generate_memoryregions_data_source(self) -> None: """Ensures the formatted generation works correctly.""" segments_to_memory_regions = { 0: 'RAM', 1: 'RAM', 13: 'FLASH', } config = bloaty_config.generate_memoryregions_data_source( segments_to_memory_regions) expected = '\n'.join(( r'custom_data_source: {', r' name: "memoryregions"', r' base_data_source: "segments"', r' rewrite: {', r' pattern:"^LOAD #0 \\[.*\\]$"', r' replacement:"RAM"', r' }', r' rewrite: {', r' pattern:"^LOAD #1 \\[.*\\]$"', r' replacement:"RAM"', r' }', r' rewrite: {', r' pattern:"^LOAD #13 \\[.*\\]$"', r' replacement:"FLASH"', r' }', r' rewrite: {', r' pattern:".*"', r' replacement:"Not resident in memory"', r' }', r'}', r'', )) self.assertEqual(expected, config) def test_generate_utilization_data_source(self) -> None: config = bloaty_config.generate_utilization_data_source() expected = '\n'.join(( 'custom_data_source: {', ' name:"utilization"', ' base_data_source:"sections"', ' rewrite: {', ' pattern:"unused_space"', ' replacement:"Free space"', ' }', ' rewrite: {', ' pattern:".*"', ' replacement:"Used space"', ' }', '}', '', )) self.assertEqual(expected, config) if __name__ == '__main__': unittest.main()