#!/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, )