nuttx-apps/testing/drivertest/test_content_gen.py
xinbingnan 9246502aca drivertest/drivertest_uart: uart driver testcase
VELAPLATFO-4612

There are three test.

1. Write a long default string into the serial port.
2. Read the default string given by the last test from the serial port.
3. Manually execute the `test_content_ gen.py` script and write the text into the serial device to test the burst capability or run this script and specify device path to automatically test.

Signed-off-by: xinbingnan <xinbingnan@xiaomi.com>
2023-02-24 17:13:06 +08:00

130 lines
3.7 KiB
Python

#!/bin/python3
# ****************************************************************************
# apps/testing/drivertest/cmocka_driver_uart/test_content_gen.py
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you 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 argparse
import sys
import time
from random import choices, randint
try:
import serial
except ImportError:
print("Please Install pyserial first [pip install pyserial]")
sys.exit(1)
DEFAULT_CONTENT = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,./<>?;':\"[]{}\\|!@#$%^&*()-+_="
def parse_args():
parser = argparse.ArgumentParser(
description="Use this script to test whether the serial port is working properly. If the device path is not "
"provided, the text of the test will be output manually, which requires the user to copy and "
"paste manually to complete the test. If provided, it will be tested automatically."
)
parser.add_argument("dev", type=str, nargs="?", help="tty device", default="")
parser.add_argument(
"-t", "--turn", type=int, nargs="?", help="test turns [10]", default=10
)
parser.add_argument(
"-l",
"--length",
type=int,
nargs="?",
help="each turn max length [100]",
default=100,
)
return parser.parse_args()
def fake_symbol(k):
return "".join(choices(DEFAULT_CONTENT, k=k))
def s_write(fd, content, end="#"):
if fd:
try:
fd.write((content + end).encode())
except Exception:
fd.flush()
fd.close()
else:
print(content, end=end)
def s_read(fd, size: int):
if fd:
try:
return fd.read(size).decode()
except Exception:
fd.flush()
fd.close()
else:
return input()
def make_test(device: str, default_content: str, turn: int, max_length: int):
fd = None
if len(device) > 0:
fd = serial.Serial(device, 115200)
if not fd.is_open:
fd.open()
print("FROM SERIAL:", s_read(fd, size=len(default_content)))
fd.flushInput()
fd.flushOutput()
print("START WRITE:")
time.sleep(1)
s_write(fd, DEFAULT_CONTENT, end="")
time.sleep(1)
print("START BURST TEST:")
fail_count = 0
for i in range(turn):
content_length = randint(1, max_length)
content = fake_symbol(content_length)
s_write(fd, f"{content_length}")
s_write(fd, content, end="")
back = s_read(fd, content_length)
if back == content:
s_write(fd, "pass")
print(f"TURN[{i + 1}]: PASS")
else:
s_write(fd, "fail")
fail_count += 1
print(f"TURN[{i + 1}]: FAIL")
s_write(fd, "0")
if fail_count != 0:
print(f"### FAIL {fail_count} TURNS ###")
else:
print("### ALL PASSED ###")
if __name__ == "__main__":
args = parse_args()
make_test(
args.dev,
default_content=DEFAULT_CONTENT,
turn=args.turn,
max_length=args.length,
)