130 lines
3.7 KiB
Python
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,
|
||
|
)
|