PageRenderTime 45ms CodeModel.GetById 25ms app.highlight 18ms RepoModel.GetById 0ms app.codeStats 0ms

/scripts/rt-tester/rt-tester.py

https://bitbucket.org/abioy/linux
Python | 222 lines | 163 code | 34 blank | 25 comment | 43 complexity | 3ab1ead5a5c18ab5580b66c1a7a8f069 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, GPL-2.0, LGPL-2.0, AGPL-1.0
  1#!/usr/bin/env 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    "lockbkl"       : "9",
 37    "unlockbkl"     : "10",
 38    "signal"        : "11",
 39    "resetevent"    : "98",
 40    "reset"         : "99",
 41    }
 42
 43test_opcodes = {
 44    "prioeq"        : ["P" , "eq" , None],
 45    "priolt"        : ["P" , "lt" , None],
 46    "priogt"        : ["P" , "gt" , None],
 47    "nprioeq"       : ["N" , "eq" , None],
 48    "npriolt"       : ["N" , "lt" , None],
 49    "npriogt"       : ["N" , "gt" , None],
 50    "unlocked"      : ["M" , "eq" , 0],
 51    "trylock"       : ["M" , "eq" , 1],
 52    "blocked"       : ["M" , "eq" , 2],
 53    "blockedwake"   : ["M" , "eq" , 3],
 54    "locked"        : ["M" , "eq" , 4],
 55    "opcodeeq"      : ["O" , "eq" , None],
 56    "opcodelt"      : ["O" , "lt" , None],
 57    "opcodegt"      : ["O" , "gt" , None],
 58    "eventeq"       : ["E" , "eq" , None],
 59    "eventlt"       : ["E" , "lt" , None],
 60    "eventgt"       : ["E" , "gt" , None],
 61    }
 62
 63# Print usage information
 64def usage():
 65    print "rt-tester.py <-c -h -q -t> <testfile>"
 66    print " -c    display comments after first command"
 67    print " -h    help"
 68    print " -q    quiet mode"
 69    print " -t    test mode (syntax check)"
 70    print " testfile: read test specification from testfile"
 71    print " otherwise from stdin"
 72    return
 73
 74# Print progress when not in quiet mode
 75def progress(str):
 76    if not quiet:
 77        print str
 78
 79# Analyse a status value
 80def analyse(val, top, arg):
 81
 82    intval = int(val)
 83
 84    if top[0] == "M":
 85        intval = intval / (10 ** int(arg))
 86	intval = intval % 10
 87        argval = top[2]
 88    elif top[0] == "O":
 89        argval = int(cmd_opcodes.get(arg, arg))
 90    else:
 91        argval = int(arg)
 92
 93    # progress("%d %s %d" %(intval, top[1], argval))
 94
 95    if top[1] == "eq" and intval == argval:
 96	return 1
 97    if top[1] == "lt" and intval < argval:
 98        return 1
 99    if top[1] == "gt" and intval > argval:
100	return 1
101    return 0
102
103# Parse the commandline
104try:
105    (options, arguments) = getopt.getopt(sys.argv[1:],'chqt')
106except getopt.GetoptError, ex:
107    usage()
108    sys.exit(1)
109
110# Parse commandline options
111for option, value in options:
112    if option == "-c":
113        comments = 1
114    elif option == "-q":
115        quiet = 1
116    elif option == "-t":
117        test = 1
118    elif option == '-h':
119        usage()
120        sys.exit(0)
121
122# Select the input source
123if arguments:
124    try:
125        fd = open(arguments[0])
126    except Exception,ex:
127        sys.stderr.write("File not found %s\n" %(arguments[0]))
128        sys.exit(1)
129else:
130    fd = sys.stdin
131
132linenr = 0
133
134# Read the test patterns
135while 1:
136
137    linenr = linenr + 1
138    line = fd.readline()
139    if not len(line):
140        break
141
142    line = line.strip()
143    parts = line.split(":")
144
145    if not parts or len(parts) < 1:
146        continue
147
148    if len(parts[0]) == 0:
149        continue
150
151    if parts[0].startswith("#"):
152	if comments > 1:
153	    progress(line)
154	continue
155
156    if comments == 1:
157	comments = 2
158
159    progress(line)
160
161    cmd = parts[0].strip().lower()
162    opc = parts[1].strip().lower()
163    tid = parts[2].strip()
164    dat = parts[3].strip()
165
166    try:
167        # Test or wait for a status value
168        if cmd == "t" or cmd == "w":
169            testop = test_opcodes[opc]
170
171            fname = "%s%s%s" %(sysfsprefix, tid, statusfile)
172            if test:
173		print fname
174                continue
175
176            while 1:
177                query = 1
178                fsta = open(fname, 'r')
179                status = fsta.readline().strip()
180                fsta.close()
181                stat = status.split(",")
182                for s in stat:
183		    s = s.strip()
184                    if s.startswith(testop[0]):
185                        # Seperate status value
186                        val = s[2:].strip()
187                        query = analyse(val, testop, dat)
188                        break
189                if query or cmd == "t":
190                    break
191
192            progress("   " + status)
193
194            if not query:
195                sys.stderr.write("Test failed in line %d\n" %(linenr))
196		sys.exit(1)
197
198        # Issue a command to the tester
199        elif cmd == "c":
200            cmdnr = cmd_opcodes[opc]
201            # Build command string and sys filename
202            cmdstr = "%s:%s" %(cmdnr, dat)
203            fname = "%s%s%s" %(sysfsprefix, tid, commandfile)
204            if test:
205		print fname
206                continue
207            fcmd = open(fname, 'w')
208            fcmd.write(cmdstr)
209            fcmd.close()
210
211    except Exception,ex:
212    	sys.stderr.write(str(ex))
213        sys.stderr.write("\nSyntax error in line %d\n" %(linenr))
214        if not test:
215            fd.close()
216            sys.exit(1)
217
218# Normal exit pass
219print "Pass"
220sys.exit(0)
221
222