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