Files
esp-idf/tools/test_apps/system/log/pytest_log.py
2025-04-23 15:46:34 +08:00

185 lines
8.8 KiB
Python

# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: CC0-1.0
import os
import sys
import time
from typing import Any
import pexpect
import pytest
from pytest_embedded import Dut
from pytest_embedded_idf.utils import idf_parametrize
def check_output(p: Any) -> None:
text_mode = isinstance(p, Dut)
p.expect_exact('example: Start')
p.expect_exact('example: char_var A 0x41')
p.expect_exact('example: var8 240 -120')
p.expect_exact('example: var16 65303 -16954 0xff17')
p.expect_exact('example: const int var -1024')
p.expect_exact('example: const long long unsigned var 2095')
p.expect_exact('example: int_var 4095 -4095')
p.expect_exact('example: var32 9000 -2000')
p.expect_exact('example: var64 10700 -29468')
p.expect_exact('example: 64 32 64 vars 10700 9000 10800')
p.expect_exact('example: var_size 96843 4')
p.expect_exact('example: float var 1.600000')
p.expect_exact('example: double var -70.199997')
p.expect_exact('example: int, double, var32, float, float, char 4095 -70.199997 9000 1.600000 1.600000 A')
p.expect(r'example: str_array 0x[0-9a-fA-F]+')
p.expect(r'example: str_ptr 0x[0-9a-fA-F]+')
p.expect_exact('example: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f')
p.expect_exact('example: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f')
p.expect_exact('example: 20 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21')
p.expect_exact('example: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35')
p.expect_exact('example: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f')
p.expect_exact('example: 50 51 52 53 54 55 56 57 58 59')
match = p.expect(r'example: buffer addr = 0x([0-9a-fA-F]+)')
addr = int((match.group(1) if text_mode else p.match.group(1)), 16)
p.expect_exact(f'example: {addr + 0:#x} 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |................|')
p.expect_exact(f'example: {addr + 16:#x} 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f |................|')
p.expect_exact(f'example: {addr + 32:#x} 20 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 | !!!!!!!!!!!!!!!|')
p.expect_exact(f'example: {addr + 48:#x} 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 |0123456789012345|')
p.expect_exact(f'example: {addr + 64:#x} 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f |@ABCDEFGHIJKLMNO|')
p.expect_exact(f'example: {addr + 80:#x} 50 51 52 53 54 55 56 57 58 59 |PQRSTUVWXY|')
p.expect_exact('example: Text1:The way to')
p.expect_exact('example: get started is ')
p.expect_exact('example: to quit talking ')
p.expect_exact('example: and begin doing.')
p.expect_exact('example: - Walt Disney')
p.expect_exact('example: Text2:The way to')
p.expect_exact('example: get started is ')
p.expect_exact('example: to quit talking ')
p.expect_exact('example: and begin doing.')
p.expect_exact('example: - Walt Disney')
match = p.expect(r'example: buffer2 addr = 0x([0-9a-fA-F]+)')
addr = int((match.group(1) if text_mode else p.match.group(1)), 16)
p.expect_exact(f'example: {addr + 0:#x} 00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 |................|')
p.expect_exact(f'example: {addr + 16:#x} 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00 |................|')
p.expect_exact(f'example: {addr + 32:#x} 08 00 00 00 09 00 00 00 0a 00 00 00 0b 00 00 00 |................|')
p.expect_exact(f'example: {addr + 48:#x} 0c 00 00 00 0d 00 00 00 0e 00 00 00 0f 00 00 00 |................|')
p.expect_exact(f'example: {addr + 64:#x} 10 00 00 00 11 00 00 00 12 00 00 00 13 00 00 00 |................|')
match = p.expect(r'example: buffer3 addr = 0x([0-9a-fA-F]+)')
addr = int((match.group(1) if text_mode else p.match.group(1)), 16)
p.expect_exact(f'example: {addr + 0:#x} 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 |................|')
p.expect_exact(f'example: {addr + 16:#x} 02 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 |................|')
p.expect_exact(f'example: {addr + 32:#x} 04 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 |................|')
p.expect_exact(f'example: {addr + 48:#x} 06 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 |................|')
p.expect_exact(f'example: {addr + 64:#x} 08 00 00 00 00 00 00 00 09 00 00 00 00 00 00 00 |................|')
p.expect_exact(f'example: {addr + 80:#x} 0a 00 00 00 00 00 00 00 |........|')
p.expect_exact('example: >>> String Formatting Tests <<<')
p.expect_exact('example: |Hello_world|')
p.expect_exact('example: | ESP32|')
p.expect_exact('example: |ESP32 |')
p.expect_exact('example: |Hello|')
p.expect_exact('example: >>> Character Formatting Tests <<<')
p.expect_exact('example: |A|')
p.expect_exact('example: >>> Integer Formatting Tests <<<')
p.expect_exact('example: |123|')
p.expect_exact('example: | 42|')
p.expect_exact('example: |00042|')
p.expect_exact('example: |42 |')
p.expect_exact('example: |00042|')
p.expect_exact('example: |+42|')
p.expect_exact('example: | 42|')
p.expect_exact('example: |123456789|')
p.expect_exact('example: |1234567890123456789|')
p.expect_exact('example: | +42|')
p.expect_exact('example: | 42|')
p.expect_exact('example: |+42 |')
p.expect_exact('example: | 42 |')
p.expect_exact('example: >>> Pointer Formatting Tests <<<')
p.expect_exact('example: |0x3ff26523|')
p.expect_exact('example: >>> Hexadecimal Formatting Tests <<<')
p.expect_exact('example: |ff|')
p.expect_exact('example: |FF|')
p.expect_exact('example: |000ff|')
p.expect_exact('example: |000ff|')
p.expect_exact('example: |ff |')
p.expect_exact('example: |ffff|')
p.expect_exact('example: |ff|')
p.expect_exact('example: |0x2a|')
p.expect_exact('example: |0XFF|')
p.expect_exact('example: | 0x2a|')
p.expect_exact('example: |0x2a |')
p.expect_exact('example: >>> Octal Formatting Tests <<<')
p.expect_exact('example: |10|')
p.expect_exact('example: |010|')
p.expect_exact('example: |777|')
p.expect_exact('example: |0777|')
p.expect_exact('example: | 052|')
p.expect_exact('example: |052 |')
p.expect_exact('example: >>> Float Formatting Tests <<<')
p.expect_exact('example: |123.456000|')
p.expect_exact('example: |123.46|')
p.expect_exact('example: |-123.46|')
p.expect_exact('example: | 3.14|')
p.expect_exact('example: |3.14 |')
p.expect_exact('example: |-123.456789|')
p.expect_exact('example: |-123.456789|')
p.expect_exact('example: >>> Scientific Float Formatting Tests <<<')
p.expect_exact('example: |123456.789000|')
p.expect_exact('example: |1.234568e+05|')
p.expect_exact('example: |1.234568E+05|')
p.expect_exact('example: |123457|')
p.expect_exact('example: |123457|')
p.expect_exact('example: >>> Literal Percent Sign Tests <<<')
p.expect_exact('example: |%|')
p.expect_exact('example: |%| |Hello_world|')
p.expect_exact('example: } |Hello_world|')
p.expect_exact('example: >>> Multiple Variables in One Log <<<')
p.expect_exact('example: string width | ESP32| |ESP32 | |ESP32|')
p.expect_exact('example: shorts |ffff| |ff|')
p.expect_exact('example: flag | 42| |-42|')
p.expect_exact('example: + flag |+42| |-42|')
p.expect_exact('example: # flag long |0x499602d2| |011145401322|')
p.expect_exact('example: longs |1234567890| |123456789012345|')
p.expect_exact('example: float width | 3.14| |3.14 | |3.1416|')
p.expect_exact('example: double width |-123.456789| |-123.456789| |-123.46|')
p.expect_exact('example: Success')
p.expect_exact('main_task: Returned from app_main()')
@pytest.mark.generic
@pytest.mark.require_elf
@pytest.mark.parametrize(
'config',
[
'v1',
'v2_bin',
'v2_bin_with_txt',
'v2_txt',
],
indirect=True,
)
@idf_parametrize('target', ['esp32', 'esp32c3'], indirect=['target'])
def test_log(dut: Dut) -> None:
if dut.app.sdkconfig.get('LOG_MODE_BINARY_EN'):
time.sleep(3) # Gives time for output logs by dut.
dut.serial.close()
monitor_cmd = f'{sys.executable} -m esp_idf_monitor --port {dut.serial.port} {dut.serial.app.elf_file}'
if dut.app.sdkconfig.get('BOOTLOADER_LOG_MODE_BINARY_EN'):
monitor_cmd += ' ' + os.path.join(dut.app.binary_path, 'bootloader', 'bootloader.elf')
monitor_log_path = os.path.join(dut.logdir, 'monitor.txt')
with open(monitor_log_path, 'w') as log, pexpect.spawn(
monitor_cmd, logfile=log, timeout=3, encoding='utf-8', codec_errors='ignore'
) as p:
check_output(p)
else:
check_output(dut)