Adding memap tests and adding to travis ci

pull/2834/head
Brian Daniels 2016-09-28 17:20:42 -05:00
parent e8b06874a3
commit abb6d2681e
3 changed files with 210 additions and 38 deletions

View File

@ -5,6 +5,7 @@ script:
- PYTHONPATH=. python tools/test/config_test/config_test.py
- python tools/test/pylint.py
- py.test tools/test/toolchains/api.py
- python tools/test/memap/memap_test.py
- python tools/build_travis.py
before_install:
- sudo add-apt-repository -y ppa:terry.guo/gcc-arm-embedded

View File

@ -518,6 +518,44 @@ class MemapParser(object):
toolchains = ["ARM", "ARM_STD", "ARM_MICRO", "GCC_ARM", "IAR"]
def compute_report(self):
for k in self.sections:
self.subtotal[k] = 0
for i in sorted(self.modules):
for k in self.sections:
self.subtotal[k] += self.modules[i][k]
# Calculate misc flash sections
self.misc_flash_mem = 0
for i in self.modules:
for k in self.misc_flash_sections:
if self.modules[i][k]:
self.misc_flash_mem += self.modules[i][k]
self.mem_summary = {
'static_ram': (self.subtotal['.data'] + self.subtotal['.bss']),
'heap': (self.subtotal['.heap']),
'stack': (self.subtotal['.stack']),
'total_ram': (self.subtotal['.data'] + self.subtotal['.bss'] +
self.subtotal['.heap']+self.subtotal['.stack']),
'total_flash': (self.subtotal['.text'] + self.subtotal['.data'] +
self.misc_flash_mem),
}
self.mem_report = []
for i in sorted(self.modules):
self.mem_report.append({
"module":i,
"size":{
k:self.modules[i][k] for k in self.print_sections
}
})
self.mem_report.append({
'summary': self.mem_summary
})
def parse(self, mapfile, toolchain):
""" Parse and decode map file depending on the toolchain
@ -540,44 +578,9 @@ class MemapParser(object):
self.parse_map_file_iar(file_input)
else:
result = False
for k in self.sections:
self.subtotal[k] = 0
for i in sorted(self.modules):
for k in self.sections:
self.subtotal[k] += self.modules[i][k]
# Calculate misc flash sections
self.misc_flash_mem = 0
for i in self.modules:
for k in self.misc_flash_sections:
if self.modules[i][k]:
self.misc_flash_mem += self.modules[i][k]
self.mem_summary = {
'static_ram': (self.subtotal['.data'] + self.subtotal['.bss']),
'heap': (self.subtotal['.heap']),
'stack': (self.subtotal['.stack']),
'total_ram': (self.subtotal['.data'] + self.subtotal['.bss'] +
self.subtotal['.heap']+self.subtotal['.stack']),
'total_flash': (self.subtotal['.text'] + self.subtotal['.data'] +
self.misc_flash_mem),
}
self.mem_report = []
for i in sorted(self.modules):
self.mem_report.append({
"module":i,
"size":{
k:self.modules[i][k] for k in self.print_sections
}
})
self.mem_report.append({
'summary': self.mem_summary
})
self.compute_report()
except IOError as error:
print "I/O error({0}): {1}".format(error.errno, error.strerror)
result = False

View File

@ -0,0 +1,168 @@
"""
mbed SDK
Copyright (c) 2016 ARM Limited
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
http://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.
"""
import sys
import os
ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))
sys.path.insert(0, ROOT)
import unittest
from tools.memap import MemapParser
from copy import deepcopy
"""
Tests for test_api.py
"""
class MemapParserTests(unittest.TestCase):
"""
Test cases for Test Api
"""
def setUp(self):
"""
Called before each test case
:return:
"""
self.memap_parser = MemapParser()
self.memap_parser.modules = {
"Misc": {
"unknown": 0,
".ARM": 8,
".ARM.extab": 0,
".init": 12,
"OUTPUT": 0,
".stack": 0,
".eh_frame": 0,
".fini_array": 4,
".heap": 0,
".stabstr": 0,
".interrupts_ram": 0,
".init_array": 0,
".stab": 0,
".ARM.attributes": 7347,
".bss": 8517,
".flash_config": 16,
".interrupts": 1024,
".data": 2325,
".ARM.exidx": 0,
".text": 59906,
".jcr": 0
},
"Fill": {
"unknown": 12,
".ARM": 0,
".ARM.extab": 0,
".init": 0,
"OUTPUT": 0,
".stack": 0,
".eh_frame": 0,
".fini_array": 0,
".heap": 65536,
".stabstr": 0,
".interrupts_ram": 1024,
".init_array": 0,
".stab": 0,
".ARM.attributes": 0,
".bss": 2235,
".flash_config": 0,
".interrupts": 0,
".data": 3,
".ARM.exidx": 0,
".text": 136,
".jcr": 0
}
}
self.memap_parser.compute_report()
def tearDown(self):
"""
Called after each test case
:return:
"""
pass
def generate_test_helper(self, output_type, file_output=None):
"""
Helper that ensures that the member variables "modules", "mem_report",
and "mem_summary" are unchanged after calling "generate_output"
:param output_type: type string that is passed to "generate_output"
:param file_output: path to output file that is passed to "generate_output"
:return:
"""
old_modules = deepcopy(self.memap_parser.modules)
old_report = deepcopy(self.memap_parser.mem_report)
old_summary = deepcopy(self.memap_parser.mem_summary)
self.memap_parser.generate_output(output_type, file_output)
self.assertEqual(self.memap_parser.modules, old_modules,
"generate_output modified the 'modules' property")
self.assertEqual(self.memap_parser.mem_report, old_report,
"generate_output modified the 'mem_report' property")
self.assertEqual(self.memap_parser.mem_summary, old_summary,
"generate_output modified the 'mem_summary' property")
def test_report_computed(self):
"""
Test ensures the report and summary are computed
:return:
"""
self.assertTrue(self.memap_parser.mem_report)
self.assertTrue(self.memap_parser.mem_summary)
self.assertEqual(self.memap_parser.mem_report[-1]['summary'],
self.memap_parser.mem_summary,
"mem_report did not contain a correct copy of mem_summary")
def test_generate_output_table(self):
"""
Test ensures that an output of type "table" can be generated correctly
:return:
"""
self.generate_test_helper('table')
def test_generate_output_json(self):
"""
Test ensures that an output of type "json" can be generated correctly
:return:
"""
file_name = '.json_test_output.json'
self.generate_test_helper('json', file_output=file_name)
self.assertTrue(os.path.exists(file_name), "Failed to create json file")
os.remove(file_name)
def test_generate_output_csv_ci(self):
"""
Test ensures that an output of type "csv-ci" can be generated correctly
:return:
"""
file_name = '.csv_ci_test_output.csv'
self.generate_test_helper('csv-ci', file_output=file_name)
self.assertTrue(os.path.exists(file_name), "Failed to create csv-ci file")
os.remove(file_name)
if __name__ == '__main__':
unittest.main()