244 lines
11 KiB
Plaintext
244 lines
11 KiB
Plaintext
*** Variables ***
|
|
${COVERAGE_TEST_BINARY_URL} https://dl.antmicro.com/projects/renode/coverage-tests/coverage-test.elf-s_3603888-0f7cfe992528c2576a9ac6a4dcc3a41b03d1d6eb
|
|
${COVERAGE_TEST_CODE_URL} https://dl.antmicro.com/projects/renode/coverage-tests/main.c
|
|
${COVERAGE_TEST_PC_LINE_SHORT_URL} https://dl.antmicro.com/projects/renode/coverage-test-long.pclin-s_3793722-41205f1fbb53838ef9e1f22ac5f93da33dd7b819
|
|
${COVERAGE_TEST_PC_LINE_LONG_URL} https://dl.antmicro.com/projects/renode/coverage-test-short.pclin-s_798598-efe5d5bbf5738887e0720a5c7673917139bfff76
|
|
${COVERAGE_TEST_CODE_FILENAME} main.c
|
|
${EXECUTION_TRACER} ${RENODETOOLS}/execution_tracer/execution_tracer_reader.py
|
|
${TRACED_CPU} cpu1
|
|
&{COVERAGE_REPORT_LINES} # pairs of line number and expected executions
|
|
... 6=28
|
|
... 7=2828
|
|
... 8=2800
|
|
... 10=28
|
|
... 12=32
|
|
... 13=3232
|
|
... 14=3200
|
|
... 16=32
|
|
... 18=2
|
|
... 19=202
|
|
... 20=200
|
|
... 22=2
|
|
... 24=1
|
|
... 25=1
|
|
... 26=101
|
|
... 27=100
|
|
... 30=1
|
|
... 32=101
|
|
... 33=100
|
|
... 34=32
|
|
... 36=100
|
|
... 37=28
|
|
... 41=1
|
|
... 43=1
|
|
... 44=1
|
|
|
|
@{COVERAGE_REPORT_LCOV}
|
|
... TN:
|
|
... SF:main.c
|
|
... DA:6,28
|
|
... DA:7,2828
|
|
... DA:8,2800
|
|
... DA:10,28
|
|
... DA:12,32
|
|
... DA:13,3232
|
|
... DA:14,3200
|
|
... DA:16,32
|
|
... DA:18,2
|
|
... DA:19,202
|
|
... DA:20,200
|
|
... DA:22,2
|
|
... DA:24,1
|
|
... DA:25,1
|
|
... DA:26,101
|
|
... DA:27,100
|
|
... DA:30,1
|
|
... DA:32,101
|
|
... DA:33,100
|
|
... DA:34,32
|
|
... DA:36,100
|
|
... DA:37,28
|
|
... DA:41,1
|
|
... DA:43,1
|
|
... DA:44,1
|
|
... end_of_record
|
|
|
|
${LINUX_32BIT_ROOTFS} https://dl.antmicro.com/projects/renode/zynq--interface-tests-rootfs.ext2-s_16777216-191638e3b3832a81bebd21d555f67bf3a4d7882a
|
|
|
|
*** Keywords ***
|
|
Execute Python Script
|
|
[Arguments] ${path} ${args} ${outputPath}=${None}
|
|
${all_args}= Create List ${path} @{args}
|
|
|
|
IF $outputPath
|
|
${out}= Evaluate open($outputPath, "w")
|
|
ELSE
|
|
${out}= Set Variable ${None}
|
|
END
|
|
|
|
Evaluate subprocess.run([sys.executable] + ${all_args}, stdout=$out) sys,subprocess
|
|
|
|
IF $out
|
|
Evaluate $out.close()
|
|
END
|
|
|
|
Download File And Rename
|
|
[Arguments] ${url} ${filename}
|
|
${temporary_file}= Download File ${url}
|
|
${path_fragments}= Split Path ${temporary_file}
|
|
${new_path}= Join Path ${path_fragments}[0] ${filename}
|
|
Move File ${temporary_file} ${new_path}
|
|
RETURN ${new_path}
|
|
|
|
Create Platform
|
|
[Arguments] ${executable}
|
|
Execute Command $bin=@${executable}
|
|
Execute Command i @scripts/single-node/kendryte_k210.resc
|
|
Execute Command cpu2 IsHalted true
|
|
|
|
Trace Execution
|
|
[Arguments] ${cpu} ${mode} ${compress}=False ${synchronous}=False
|
|
|
|
${trace_file}= Allocate Temporary File
|
|
|
|
Execute Command ${cpu} CreateExecutionTracing "trace" @${trace_file} ${mode} isBinary=true compress=${compress} isSynchronous=${synchronous}
|
|
Execute Command emulation RunFor "0.017"
|
|
Execute Command ${cpu} DisableExecutionTracing
|
|
RETURN ${trace_file}
|
|
|
|
Line Should Report Executions
|
|
[Arguments] ${line} ${executions}
|
|
Should Start With ${line} ${executions}: strip_spaces=True collapse_spaces=True
|
|
|
|
Should Report Proper Coverage
|
|
[Arguments] ${report} ${expected_lines}
|
|
FOR ${expected_line} IN &{expected_lines}
|
|
${line_index}= Evaluate ${expected_line}[0] - 1
|
|
Line Should Report Executions ${report}[${line_index}] ${expected_line}[1]
|
|
END
|
|
|
|
FOR ${line_index} ${report_line} IN ENUMERATE @{report}
|
|
${line_number}= Evaluate str(${line_index} + 1)
|
|
IF ${{ $line_number not in $COVERAGE_REPORT_LINES }}
|
|
Line Should Report Executions ${report_line} 0
|
|
END
|
|
END
|
|
|
|
Should Report Proper Coverage LCOV
|
|
[Arguments] ${report} ${expected_lines}
|
|
Should Be Equal As Strings ${report} ${expected_lines} strip_spaces=True
|
|
|
|
Trace And Report Coverage
|
|
[Arguments] ${is_legacy} ${compress}=False ${use_pc2line}="no"
|
|
${coverage_file}= Allocate Temporary File
|
|
${binary_file}= Download File ${COVERAGE_TEST_BINARY_URL}
|
|
${code_file}= Download File And Rename ${COVERAGE_TEST_CODE_URL} ${COVERAGE_TEST_CODE_FILENAME}
|
|
|
|
Create Platform ${COVERAGE_TEST_BINARY_URL}
|
|
|
|
${trace}= Trace Execution ${TRACED_CPU} PC ${compress}
|
|
${script_args}= Create List
|
|
|
|
IF ${compress} == True
|
|
Append To List ${script_args} --decompress
|
|
END
|
|
|
|
Append To List ${script_args}
|
|
... coverage
|
|
... ${trace}
|
|
... --sources
|
|
... ${code_file}
|
|
... --output
|
|
... ${coverage_file}
|
|
|
|
IF ${is_legacy} == True
|
|
Append To List ${script_args} --legacy
|
|
END
|
|
|
|
IF $use_pc2line == "short"
|
|
${pclin_short_file}= Download File ${COVERAGE_TEST_PC_LINE_SHORT_URL}
|
|
Append To List ${script_args}
|
|
... --pc2line
|
|
... ${pclin_short_file}
|
|
ELSE IF $use_pc2line == "long"
|
|
${pclin_long_file}= Download File ${COVERAGE_TEST_PC_LINE_LONG_URL}
|
|
Append To List ${script_args}
|
|
... --pc2line
|
|
... ${pclin_long_file}
|
|
ELSE
|
|
Append To List ${script_args}
|
|
... --binary
|
|
... ${binary_file}
|
|
END
|
|
|
|
Execute Python Script ${EXECUTION_TRACER} ${script_args}
|
|
|
|
${coverage_report_content}= Get File ${coverage_file}
|
|
${coverage_report}= Split To Lines ${coverage_report_content}
|
|
IF ${is_legacy} == True
|
|
Should Report Proper Coverage ${coverage_report} ${COVERAGE_REPORT_LINES}
|
|
ELSE
|
|
# The slice is necessary to omit "filename", which is expected to differ (since the absolute paths are never the same in the temp directory)
|
|
Should Report Proper Coverage LCOV ${coverage_report}[2:] ${COVERAGE_REPORT_LCOV}[2:]
|
|
END
|
|
|
|
*** Test Cases ***
|
|
Trace And Report Coverage
|
|
Trace And Report Coverage False
|
|
|
|
Trace And Report Coverage In Legacy Format
|
|
Trace And Report Coverage True
|
|
|
|
Trace With Compressed Output And Report Coverage
|
|
Trace And Report Coverage False True
|
|
|
|
Trace With Compressed Output And Report Coverage In Legacy Format
|
|
Trace And Report Coverage True True
|
|
|
|
Trace And Report Coverage Using Short Pc2Line Mappings
|
|
Trace And Report Coverage False False short
|
|
|
|
Trace And Report Coverage Using Long Pc2Line Mappings
|
|
Trace And Report Coverage False False long
|
|
|
|
Trace Mixed A64, A32 and T32 Code
|
|
${disassembly_file}= Allocate Temporary File
|
|
|
|
Execute Command $rootfs=@${LINUX_32BIT_ROOTFS}
|
|
Execute Command $bootargs="earlycon console=ttyPS1,115200n8 root=/dev/ram0 rw initrd=0x20000000,64M nr_cpus=1"
|
|
Execute Command include @scripts/single-node/zynqmp_linux.resc
|
|
Execute Command machine SetSerialExecution True
|
|
Create Terminal Tester sysbus.uart1 defaultPauseEmulation=true
|
|
|
|
Wait For Prompt On Uart buildroot login: timeout=50
|
|
Write Line To Uart root
|
|
|
|
Wait For Prompt On Uart \#
|
|
Write Line To Uart uname -a
|
|
|
|
${trace}= Trace Execution apu0 PCAndOpcode synchronous=True
|
|
|
|
${script_args}= Create List
|
|
|
|
Append To List ${script_args}
|
|
... inspect
|
|
... --disassemble
|
|
... ${trace}
|
|
|
|
Execute Python Script ${EXECUTION_TRACER} ${script_args} outputPath=${disassembly_file}
|
|
|
|
# Note: The specific opcodes and PCs don't really matter, we only want to ensure that each of the
|
|
# instruction categories was disassembled correctly.
|
|
|
|
# A64
|
|
${x}= Grep File ${disassembly_file} 0x0000000010011FE4:*0xD69F03E0*eret
|
|
Should Not Be Empty ${x}
|
|
|
|
# A32
|
|
${x}= Grep File ${disassembly_file} 0x000000087F052D0C:*0xE92D40F0*push*{r4,*r5,*r6,*r7,*lr}
|
|
Should Not Be Empty ${x}
|
|
|
|
# T32
|
|
${x}= Grep File ${disassembly_file} 0x000000087F07E4D8:*0xBF04*itt*eq
|
|
Should Not Be Empty ${x}
|