xref: /utopia/UTPA2-700.0.x/projects/build/scripts/rt-tester/rt-tester.py (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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