linux/scripts/rt-tester/rt-tester.py
<<
>>
Prefs
   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
 220
 221
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.