Skip to content

Commit

Permalink
add test for checking memory segments with esptool.py
Browse files Browse the repository at this point in the history
  • Loading branch information
simon.chupin committed Jan 27, 2022
1 parent a985402 commit 22cd519
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 30 deletions.
15 changes: 2 additions & 13 deletions tools/idf_size.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,8 @@
# Includes information which is not shown in "xtensa-esp32-elf-size",
# or easy to parse from "xtensa-esp32-elf-objdump" or raw map files.
#
# Copyright 2017-2021 Espressif Systems (Shanghai) CO LTD
#
# 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.
# SPDX-FileCopyrightText: 2017-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
#
from __future__ import division, print_function, unicode_literals

Expand Down
21 changes: 21 additions & 0 deletions tools/test_idf_size/expected_output
Original file line number Diff line number Diff line change
@@ -1,4 +1,25 @@

***
Building project for esp32...

***
Running mem_test.py for esp32...
Test complete without errors

***
Building project for esp32s2...

***
Running mem_test.py for esp32s2...
Test complete without errors

***
Building project for esp32c3...

***
Running mem_test.py for esp32c3...
Test complete without errors

***
Running idf_size.py...
Total sizes:
Expand Down
52 changes: 52 additions & 0 deletions tools/test_idf_size/mem_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#!/usr/bin/env python
#
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
#
import argparse
import json
import os
import re
from typing import Dict

IDF_PATH = os.environ['IDF_PATH']
MAX_SIZE_DIFF = 50


def mem_test(size_json, esptool_output): # type: (dict, list) -> None
seg_len = {} # type: Dict[str, int]
for i in esptool_output:
tmp = i.split(' ')
if tmp[0] == 'Segment':
# tmp look like ['Segment', '2:', 'len', '0x02780', 'load', '0x3fc90610', 'file_offs', '0x00007ab0', '[BYTE_ACCESSIBLE,MEM_INTERNAL,DRAM]']
# tmp[3] contains the size of the segment and tmp[8] contains the name of the memory segment
esptool_mem = {'mem_type':tmp[8], 'size':tmp[3]}
seg = re.sub(r'MEM_INTERNAL|,|BYTE_ACCESSIBLE|\n|\[|\]', '', esptool_mem['mem_type'])
# If there are two IRAMs in esptool output it will compute these two IRAM lengths in a seg_len['IRAM']
seg_len[seg] = int(esptool_mem['size'], 16) if seg not in seg_len else seg_len[seg] + int(esptool_mem['size'], 16)
# including flash_other to DROM because flash_other contain .flash.appdesc that includes in DROM that produced by esptool
size_from_map = [('IROM', size_json['flash_code']), ('IRAM', size_json['iram_text'] + size_json['iram_vectors'] + size_json['diram_text']
+ size_json['diram_vectors']), ('DROM', size_json['flash_rodata'] + size_json['flash_other']), ('DRAM', size_json
['dram_data'] + size_json['diram_data'])]
for mem_type, size in size_from_map:
if abs(size - seg_len[mem_type]) > MAX_SIZE_DIFF:
raise RuntimeError(mem_type + " segment in idf_size isn't correct regarding esptool")
print('Test complete without errors')


def main(): # type: () -> None
parser = argparse.ArgumentParser(description='mem_test.py - a tool to test accuracy of the sizes of the memory segments regarding idf.py size by esptool')

parser.add_argument(
'size_json', help='JSON file with the output of the idf.py size',
type=argparse.FileType('r'))
parser.add_argument(
'esptool_output', help='File with the output of the esptool',
type=argparse.FileType('r'))

args = parser.parse_args()
mem_test(json.loads(args.size_json.read()), args.esptool_output.read().split('\n'))


if __name__ == '__main__':
main()
46 changes: 29 additions & 17 deletions tools/test_idf_size/test.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,31 @@
#!/usr/bin/env bash

{ coverage debug sys \
&& coverage erase &> output \

memory_test () {
pushd $IDF_PATH/examples/get-started/hello_world \
&& echo -e "\n***\nBuilding project for $1..." &>> $IDF_PATH/tools/test_idf_size/output \
&& idf.py set-target $1 \
&& idf.py build \
&& echo -e "\n***\nRunning mem_test.py for $1..." &>> $IDF_PATH/tools/test_idf_size/output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json build/hello-world.map > size_output.json \
&& python $IDF_PATH/components/esptool_py/esptool/esptool.py --chip $1 image_info build/hello-world.bin > esptool_output \
&& python -m coverage run -a $IDF_PATH/tools/test_idf_size/mem_test.py size_output.json esptool_output &>> $IDF_PATH/tools/test_idf_size/output \
&& popd
}

json_test() {
echo -e "\n***\nProducing JSON output for $1..." &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json app_$1.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archives app_$1.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --files app_$1.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archive_details libdriver.a app_$1.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output
}

{ python -m coverage debug sys \
&& python -m coverage erase &> output \
&& memory_test esp32 \
&& memory_test esp32s2 \
&& memory_test esp32c3 \
&& echo -e "\n***\nRunning idf_size.py..." &>> output \
&& coverage run -a $IDF_PATH/tools/idf_size.py app.map &>> output \
&& echo -e "\n***\nRunning idf_size.py on bootloader..." &>> output \
Expand Down Expand Up @@ -101,21 +125,9 @@
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archives app.map --diff app2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --files app.map --diff app2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archive_details libdriver.a app.map --diff app2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& echo -e "\n***\nProducing JSON output for esp32s2..." &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json app_esp32s2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archives app_esp32s2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --files app_esp32s2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archive_details libdriver.a app_esp32s2.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& echo -e "\n***\nProducing JSON output for esp32c3..." &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json app_esp32c3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archives app_esp32c3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --files app_esp32c3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archive_details libdriver.a app_esp32c3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& echo -e "\n***\nProducing JSON output for esp32s3..." &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json app_esp32s3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archives app_esp32s3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --files app_esp32s3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& python -m coverage run -a $IDF_PATH/tools/idf_size.py --json --archive_details libdriver.a app_esp32s3.map | python $IDF_PATH/tools/test_idf_size/json_validate_test.py &>> output \
&& json_test esp32s2 \
&& json_test esp32c3 \
&& json_test esp32s3 \
&& echo -e "\n***\nProducing JSON file output..." &>> output \
&& coverage run -a $IDF_PATH/tools/idf_size.py --json --output-file output.json app.map &>> output \
&& echo -e "\n***\nProducing text file output..." &>> output \
Expand Down

0 comments on commit 22cd519

Please sign in to comment.