1*53ee8cc1Swenshuai.xi#!/usr/bin/python 2*53ee8cc1Swenshuai.xi# 3*53ee8cc1Swenshuai.xi# rt-mutex tester 4*53ee8cc1Swenshuai.xi# 5*53ee8cc1Swenshuai.xi# (C) 2006 Thomas Gleixner <tglx@linutronix.de> 6*53ee8cc1Swenshuai.xi# 7*53ee8cc1Swenshuai.xi# This program is free software; you can redistribute it and/or modify 8*53ee8cc1Swenshuai.xi# it under the terms of the GNU General Public License version 2 as 9*53ee8cc1Swenshuai.xi# published by the Free Software Foundation. 10*53ee8cc1Swenshuai.xi# 11*53ee8cc1Swenshuai.xiimport os 12*53ee8cc1Swenshuai.xiimport sys 13*53ee8cc1Swenshuai.xiimport getopt 14*53ee8cc1Swenshuai.xiimport shutil 15*53ee8cc1Swenshuai.xiimport string 16*53ee8cc1Swenshuai.xi 17*53ee8cc1Swenshuai.xi# Globals 18*53ee8cc1Swenshuai.xiquiet = 0 19*53ee8cc1Swenshuai.xitest = 0 20*53ee8cc1Swenshuai.xicomments = 0 21*53ee8cc1Swenshuai.xi 22*53ee8cc1Swenshuai.xisysfsprefix = "/sys/devices/system/rttest/rttest" 23*53ee8cc1Swenshuai.xistatusfile = "/status" 24*53ee8cc1Swenshuai.xicommandfile = "/command" 25*53ee8cc1Swenshuai.xi 26*53ee8cc1Swenshuai.xi# Command opcodes 27*53ee8cc1Swenshuai.xicmd_opcodes = { 28*53ee8cc1Swenshuai.xi "schedother" : "1", 29*53ee8cc1Swenshuai.xi "schedfifo" : "2", 30*53ee8cc1Swenshuai.xi "lock" : "3", 31*53ee8cc1Swenshuai.xi "locknowait" : "4", 32*53ee8cc1Swenshuai.xi "lockint" : "5", 33*53ee8cc1Swenshuai.xi "lockintnowait" : "6", 34*53ee8cc1Swenshuai.xi "lockcont" : "7", 35*53ee8cc1Swenshuai.xi "unlock" : "8", 36*53ee8cc1Swenshuai.xi "signal" : "11", 37*53ee8cc1Swenshuai.xi "resetevent" : "98", 38*53ee8cc1Swenshuai.xi "reset" : "99", 39*53ee8cc1Swenshuai.xi } 40*53ee8cc1Swenshuai.xi 41*53ee8cc1Swenshuai.xitest_opcodes = { 42*53ee8cc1Swenshuai.xi "prioeq" : ["P" , "eq" , None], 43*53ee8cc1Swenshuai.xi "priolt" : ["P" , "lt" , None], 44*53ee8cc1Swenshuai.xi "priogt" : ["P" , "gt" , None], 45*53ee8cc1Swenshuai.xi "nprioeq" : ["N" , "eq" , None], 46*53ee8cc1Swenshuai.xi "npriolt" : ["N" , "lt" , None], 47*53ee8cc1Swenshuai.xi "npriogt" : ["N" , "gt" , None], 48*53ee8cc1Swenshuai.xi "unlocked" : ["M" , "eq" , 0], 49*53ee8cc1Swenshuai.xi "trylock" : ["M" , "eq" , 1], 50*53ee8cc1Swenshuai.xi "blocked" : ["M" , "eq" , 2], 51*53ee8cc1Swenshuai.xi "blockedwake" : ["M" , "eq" , 3], 52*53ee8cc1Swenshuai.xi "locked" : ["M" , "eq" , 4], 53*53ee8cc1Swenshuai.xi "opcodeeq" : ["O" , "eq" , None], 54*53ee8cc1Swenshuai.xi "opcodelt" : ["O" , "lt" , None], 55*53ee8cc1Swenshuai.xi "opcodegt" : ["O" , "gt" , None], 56*53ee8cc1Swenshuai.xi "eventeq" : ["E" , "eq" , None], 57*53ee8cc1Swenshuai.xi "eventlt" : ["E" , "lt" , None], 58*53ee8cc1Swenshuai.xi "eventgt" : ["E" , "gt" , None], 59*53ee8cc1Swenshuai.xi } 60*53ee8cc1Swenshuai.xi 61*53ee8cc1Swenshuai.xi# Print usage information 62*53ee8cc1Swenshuai.xidef usage(): 63*53ee8cc1Swenshuai.xi print "rt-tester.py <-c -h -q -t> <testfile>" 64*53ee8cc1Swenshuai.xi print " -c display comments after first command" 65*53ee8cc1Swenshuai.xi print " -h help" 66*53ee8cc1Swenshuai.xi print " -q quiet mode" 67*53ee8cc1Swenshuai.xi print " -t test mode (syntax check)" 68*53ee8cc1Swenshuai.xi print " testfile: read test specification from testfile" 69*53ee8cc1Swenshuai.xi print " otherwise from stdin" 70*53ee8cc1Swenshuai.xi return 71*53ee8cc1Swenshuai.xi 72*53ee8cc1Swenshuai.xi# Print progress when not in quiet mode 73*53ee8cc1Swenshuai.xidef progress(str): 74*53ee8cc1Swenshuai.xi if not quiet: 75*53ee8cc1Swenshuai.xi print str 76*53ee8cc1Swenshuai.xi 77*53ee8cc1Swenshuai.xi# Analyse a status value 78*53ee8cc1Swenshuai.xidef analyse(val, top, arg): 79*53ee8cc1Swenshuai.xi 80*53ee8cc1Swenshuai.xi intval = int(val) 81*53ee8cc1Swenshuai.xi 82*53ee8cc1Swenshuai.xi if top[0] == "M": 83*53ee8cc1Swenshuai.xi intval = intval / (10 ** int(arg)) 84*53ee8cc1Swenshuai.xi intval = intval % 10 85*53ee8cc1Swenshuai.xi argval = top[2] 86*53ee8cc1Swenshuai.xi elif top[0] == "O": 87*53ee8cc1Swenshuai.xi argval = int(cmd_opcodes.get(arg, arg)) 88*53ee8cc1Swenshuai.xi else: 89*53ee8cc1Swenshuai.xi argval = int(arg) 90*53ee8cc1Swenshuai.xi 91*53ee8cc1Swenshuai.xi # progress("%d %s %d" %(intval, top[1], argval)) 92*53ee8cc1Swenshuai.xi 93*53ee8cc1Swenshuai.xi if top[1] == "eq" and intval == argval: 94*53ee8cc1Swenshuai.xi return 1 95*53ee8cc1Swenshuai.xi if top[1] == "lt" and intval < argval: 96*53ee8cc1Swenshuai.xi return 1 97*53ee8cc1Swenshuai.xi if top[1] == "gt" and intval > argval: 98*53ee8cc1Swenshuai.xi return 1 99*53ee8cc1Swenshuai.xi return 0 100*53ee8cc1Swenshuai.xi 101*53ee8cc1Swenshuai.xi# Parse the commandline 102*53ee8cc1Swenshuai.xitry: 103*53ee8cc1Swenshuai.xi (options, arguments) = getopt.getopt(sys.argv[1:],'chqt') 104*53ee8cc1Swenshuai.xiexcept getopt.GetoptError, ex: 105*53ee8cc1Swenshuai.xi usage() 106*53ee8cc1Swenshuai.xi sys.exit(1) 107*53ee8cc1Swenshuai.xi 108*53ee8cc1Swenshuai.xi# Parse commandline options 109*53ee8cc1Swenshuai.xifor option, value in options: 110*53ee8cc1Swenshuai.xi if option == "-c": 111*53ee8cc1Swenshuai.xi comments = 1 112*53ee8cc1Swenshuai.xi elif option == "-q": 113*53ee8cc1Swenshuai.xi quiet = 1 114*53ee8cc1Swenshuai.xi elif option == "-t": 115*53ee8cc1Swenshuai.xi test = 1 116*53ee8cc1Swenshuai.xi elif option == '-h': 117*53ee8cc1Swenshuai.xi usage() 118*53ee8cc1Swenshuai.xi sys.exit(0) 119*53ee8cc1Swenshuai.xi 120*53ee8cc1Swenshuai.xi# Select the input source 121*53ee8cc1Swenshuai.xiif arguments: 122*53ee8cc1Swenshuai.xi try: 123*53ee8cc1Swenshuai.xi fd = open(arguments[0]) 124*53ee8cc1Swenshuai.xi except Exception,ex: 125*53ee8cc1Swenshuai.xi sys.stderr.write("File not found %s\n" %(arguments[0])) 126*53ee8cc1Swenshuai.xi sys.exit(1) 127*53ee8cc1Swenshuai.xielse: 128*53ee8cc1Swenshuai.xi fd = sys.stdin 129*53ee8cc1Swenshuai.xi 130*53ee8cc1Swenshuai.xilinenr = 0 131*53ee8cc1Swenshuai.xi 132*53ee8cc1Swenshuai.xi# Read the test patterns 133*53ee8cc1Swenshuai.xiwhile 1: 134*53ee8cc1Swenshuai.xi 135*53ee8cc1Swenshuai.xi linenr = linenr + 1 136*53ee8cc1Swenshuai.xi line = fd.readline() 137*53ee8cc1Swenshuai.xi if not len(line): 138*53ee8cc1Swenshuai.xi break 139*53ee8cc1Swenshuai.xi 140*53ee8cc1Swenshuai.xi line = line.strip() 141*53ee8cc1Swenshuai.xi parts = line.split(":") 142*53ee8cc1Swenshuai.xi 143*53ee8cc1Swenshuai.xi if not parts or len(parts) < 1: 144*53ee8cc1Swenshuai.xi continue 145*53ee8cc1Swenshuai.xi 146*53ee8cc1Swenshuai.xi if len(parts[0]) == 0: 147*53ee8cc1Swenshuai.xi continue 148*53ee8cc1Swenshuai.xi 149*53ee8cc1Swenshuai.xi if parts[0].startswith("#"): 150*53ee8cc1Swenshuai.xi if comments > 1: 151*53ee8cc1Swenshuai.xi progress(line) 152*53ee8cc1Swenshuai.xi continue 153*53ee8cc1Swenshuai.xi 154*53ee8cc1Swenshuai.xi if comments == 1: 155*53ee8cc1Swenshuai.xi comments = 2 156*53ee8cc1Swenshuai.xi 157*53ee8cc1Swenshuai.xi progress(line) 158*53ee8cc1Swenshuai.xi 159*53ee8cc1Swenshuai.xi cmd = parts[0].strip().lower() 160*53ee8cc1Swenshuai.xi opc = parts[1].strip().lower() 161*53ee8cc1Swenshuai.xi tid = parts[2].strip() 162*53ee8cc1Swenshuai.xi dat = parts[3].strip() 163*53ee8cc1Swenshuai.xi 164*53ee8cc1Swenshuai.xi try: 165*53ee8cc1Swenshuai.xi # Test or wait for a status value 166*53ee8cc1Swenshuai.xi if cmd == "t" or cmd == "w": 167*53ee8cc1Swenshuai.xi testop = test_opcodes[opc] 168*53ee8cc1Swenshuai.xi 169*53ee8cc1Swenshuai.xi fname = "%s%s%s" %(sysfsprefix, tid, statusfile) 170*53ee8cc1Swenshuai.xi if test: 171*53ee8cc1Swenshuai.xi print fname 172*53ee8cc1Swenshuai.xi continue 173*53ee8cc1Swenshuai.xi 174*53ee8cc1Swenshuai.xi while 1: 175*53ee8cc1Swenshuai.xi query = 1 176*53ee8cc1Swenshuai.xi fsta = open(fname, 'r') 177*53ee8cc1Swenshuai.xi status = fsta.readline().strip() 178*53ee8cc1Swenshuai.xi fsta.close() 179*53ee8cc1Swenshuai.xi stat = status.split(",") 180*53ee8cc1Swenshuai.xi for s in stat: 181*53ee8cc1Swenshuai.xi s = s.strip() 182*53ee8cc1Swenshuai.xi if s.startswith(testop[0]): 183*53ee8cc1Swenshuai.xi # Separate status value 184*53ee8cc1Swenshuai.xi val = s[2:].strip() 185*53ee8cc1Swenshuai.xi query = analyse(val, testop, dat) 186*53ee8cc1Swenshuai.xi break 187*53ee8cc1Swenshuai.xi if query or cmd == "t": 188*53ee8cc1Swenshuai.xi break 189*53ee8cc1Swenshuai.xi 190*53ee8cc1Swenshuai.xi progress(" " + status) 191*53ee8cc1Swenshuai.xi 192*53ee8cc1Swenshuai.xi if not query: 193*53ee8cc1Swenshuai.xi sys.stderr.write("Test failed in line %d\n" %(linenr)) 194*53ee8cc1Swenshuai.xi sys.exit(1) 195*53ee8cc1Swenshuai.xi 196*53ee8cc1Swenshuai.xi # Issue a command to the tester 197*53ee8cc1Swenshuai.xi elif cmd == "c": 198*53ee8cc1Swenshuai.xi cmdnr = cmd_opcodes[opc] 199*53ee8cc1Swenshuai.xi # Build command string and sys filename 200*53ee8cc1Swenshuai.xi cmdstr = "%s:%s" %(cmdnr, dat) 201*53ee8cc1Swenshuai.xi fname = "%s%s%s" %(sysfsprefix, tid, commandfile) 202*53ee8cc1Swenshuai.xi if test: 203*53ee8cc1Swenshuai.xi print fname 204*53ee8cc1Swenshuai.xi continue 205*53ee8cc1Swenshuai.xi fcmd = open(fname, 'w') 206*53ee8cc1Swenshuai.xi fcmd.write(cmdstr) 207*53ee8cc1Swenshuai.xi fcmd.close() 208*53ee8cc1Swenshuai.xi 209*53ee8cc1Swenshuai.xi except Exception,ex: 210*53ee8cc1Swenshuai.xi sys.stderr.write(str(ex)) 211*53ee8cc1Swenshuai.xi sys.stderr.write("\nSyntax error in line %d\n" %(linenr)) 212*53ee8cc1Swenshuai.xi if not test: 213*53ee8cc1Swenshuai.xi fd.close() 214*53ee8cc1Swenshuai.xi sys.exit(1) 215*53ee8cc1Swenshuai.xi 216*53ee8cc1Swenshuai.xi# Normal exit pass 217*53ee8cc1Swenshuai.xiprint "Pass" 218*53ee8cc1Swenshuai.xisys.exit(0) 219*53ee8cc1Swenshuai.xi 220*53ee8cc1Swenshuai.xi 221