rendered paste body#!/usr/bin/env python############################################################################### Linux Desktop Testing Project http://ldtp.freedesktop.org# # ldtprunner## Author:# A. Nagappan <nagappan@gmail.com># # Copyright 2005 - 2006 Novell, Inc.# # This program is free software; you can redistribute it and/or# modify it under the terms of the GNU Lesser General Public# License as published by the Free Software Foundation; either# version 2 of the License, or (at your option) any later version.# # This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU# Lesser General Public License for more details.# # You should have received a copy of the GNU Lesser General Public# License along with this program; if not, write to the# Free Software Foundation, Inc., 59 Temple Place - Suite 330,# Boston, MA 02111-1307, USA.##############################################################################import sys, re, os, commands, time, trace, tracebackimport xml.dom.minidomfrom optparse import OptionParser#Defining the command line argumentsusage = 'Usage:\n %prog [-c CONFIGFILE -i IPADDRESS [-p PORT]] xmlfile'parser = OptionParser (usage)parser.add_option ('-c', '--conf', dest='conffile', help='Add configuration file')parser.add_option ('-i', '--ip', dest='ipAddress', help='LDTP engine IP address')parser.add_option ('-p', '--port', dest='port', help='LDTP engine port')(options, args) = parser.parse_args ()if len (args) != 1: parser.error ('Incorrect number of arguments')filename = options.conffileif options.ipAddress != None: os.environ['LDTP_SERVER_ADDR'] = options.ipAddress if options.port != None: os.environ['LDTP_SERVER_PORT'] = options.porttry: dom = xml.dom.minidom.parse (args[0])except xml.parsers.expat.ExpatError, msg: print 'XML Error: ' + str (msg) sys.exit (1)except IOError: print 'XML \"' + args[0] + '\" file not found' sys.exit (1)class TESTCASESTATE(object): TCS_ENTERING = 1 TCS_RUNNING = 2 TCS_EXITING = 3scriptLevelTimeinfo = Falseg_prj_tcID = 0g_prj_tccaseentername = Noneg_prj_tccaseexitname = Noneg_prj_tcappstatename = Noneg_prj_exception = Falseg_prj_casestate = Nonedef getText (nodelist): rc = "" for node in nodelist: if node.nodeType == node.TEXT_NODE: rc = rc + node.data return rcdef getFullPath (path): if path[0] == "~": path = os.path.expanduser (path) elif path[0] == ".": path = os.path.abspath (path) return pathimport ldtp, ldtputilsdef executeldtp (ldtpxmldata): global g_prj_tccaseentername, g_prj_tccaseexitname ldtpxml = ldtpxmldata.getElementsByTagName ('ldtp') if ldtpxml == []: ldtp.log ('ldtp xml tag not present') print 'ldtp xml tag not present' sys.exit (1) logfileappend = 1 logfilename = '' for ldtpelements in ldtpxml: try: logfileoverwrite = ldtpelements.getElementsByTagName ('logfileoverwrite')[0] logfileupdate = getText (logfileoverwrite.childNodes) try: logfileappend = int (logfileupdate) except ValueError: # print 'Log file append status not integer value - ' + logfileupdate log ('Log file append status not integer value - ' + logfileupdate, 'warning') pass # print 'Log append - ' + logfileappend except IndexError: # print 'Log file overwrite not present' pass try: logconf = ldtpelements.getElementsByTagName ('logconf')[0] logConfFile = getText (logconf.childNodes) ldtp.addlogger (logConfFile) except IndexError: # print 'Log configuration file' pass try: logfile = ldtpelements.getElementsByTagName ('logfile')[0] logfilename = getText (logfile.childNodes) logfilename = getFullPath(logfilename) ldtp.startlog (logfilename, int (logfileappend)) # print 'Log file name - ' + logfilename + ' - overwrite - ' + str (int (logfileappend)) except IndexError: # print 'Log file entry not present' raise ldtp.LdtpExecutionError ('logfile tag not present') try: loglevel = ldtpelements.getElementsByTagName ('loglevel')[0] logLevel = getText (loglevel.childNodes) ldtp.setloglevel (logLevel) except IndexError: # print 'Log configuration file' pass try: appmapfile = ldtpelements.getElementsByTagName ('appmapfile')[0] appmapfilename = getText (appmapfile.childNodes) appmapfilename = getFullPath(appmapfilename) # print 'Appmap file name: ' + appmapfilename ldtp.log ('appmap file name ' + appmapfilename, 'info') ldtp.initappmap (appmapfilename) except IndexError: # print 'Log file entry not present' pass except ldtp.LdtpExecutionError, msg: # print 'appmap could not be initalize ' + str (msg) ldtp.log ('Appmap could not be initalized ' + str (msg), 'error') # Check the tag for case enter and exit try: tcenter = ldtpelements.getElementsByTagName ("caseenter")[0] tcentername = getText (tcenter.childNodes) tcentername = getFullPath(tcentername) except IndexError: ldtp.log ('Not use TestCase Enter', 'info') else: g_prj_tccaseentername = tcentername try: tcexit = ldtpelements.getElementsByTagName ("caseexit")[0] tcexitname = getText (tcexit.childNodes) tcexitname = getFullPath(tcexitname) except IndexError: ldtp.log ('Not use TestCase Exit', 'info') else: g_prj_tccaseexitname = tcexitname try: executecategories (ldtpelements) except KeyboardInterrupt: return if logfilename != '': ldtp.stoplog ()def executecategories (ldtpelements): categories = ldtpelements.getElementsByTagName ('category') if categories == []: executegroup (ldtpelements) return i = 1 _categoryTestcaseCount = 0 _categoryScriptPassCount = 0 _startTime = time.time () _startLocalTime = time.strftime ('%H:%M:%S %p on %d-%b-%Y', time.localtime ()) for categoryelements in categories: categoryname = None try: categoryname = categoryelements.getElementsByTagName ('name')[0] except IndexError: # print 'Script file entry not present - skipping' ldtp.log ('categoryname entry not present - skipping', 'info') if categoryname != None and categoryname.parentNode == categoryelements: ldtp.log (getText (categoryname.childNodes), 'categorystart') else: ldtp.log (categoryelements.nodeName + str (i), 'categorystart') scriptPassCount, totalScripts = executegroup (categoryelements) _categoryScriptPassCount += scriptPassCount _categoryTestcaseCount += totalScripts if categoryname != None and categoryname.parentNode == categoryelements: ldtp.log (getText (categoryname.childNodes), 'categoryend') else: ldtp.log ('Executing ' + categoryelements.nodeName + str (i), 'categoryend') i = i + 1 ldtp.log ('start=\"' + str (_startLocalTime) + '\" elapsed=\"' + getElapsedTime (time.time (), _startTime) + '\"', 'totaltimeinfo') ldtp.log ('total=\"' + str (_categoryTestcaseCount) + '\" pass=\"' + str (_categoryScriptPassCount) + \ '\" fail=\"' + str (_categoryTestcaseCount - _categoryScriptPassCount) + '\"', 'categorystatus')def executegroup (ldtpelements): global g_prj_tcID, g_prj_exception, g_prj_casestate global g_prj_tccaseentername, g_prj_tccaseexitname, g_prj_tcappstatename global scriptLevelTimeinfo try: groups = ldtpelements.getElementsByTagName ("testcase") groups[0] except IndexError: groups = ldtpelements.getElementsByTagName ("group") if groups == []: raise ldtp.LdtpExecutionError ('Atleast one group tag should be present') groupstart = 'groupstart' groupend = 'groupend' i = 1 _groupTestcaseCount = 0 _groupScriptPassCount = 0 for groupelements in groups: comment = None testcaseid = None groupname = None try: testcaseid = groupelements.getElementsByTagName ("testcaseid")[0] except IndexError: # print 'Script file entry not present - skipping' ldtp.log ('testcaseid entry not present - skipping', 'info') try: groupname = groupelements.getElementsByTagName ("name")[0] except IndexError: # print 'Script file entry not present - skipping' ldtp.log ('groupname entry not present - skipping', 'info') try: _scriptLevelTimeInfo = groupelements.getElementsByTagName ('scripttimeinfo')[0] try: if int (getText (_scriptLevelTimeInfo.childNodes)) == 1: scriptLevelTimeinfo = True except ValueError: pass except IndexError: pass try: comment = groupelements.getElementsByTagName ("comment")[0] except IndexError: # print 'Script file entry not present - skipping' ldtp.log ('comment entry not present - skipping', 'info') # Check the tag for the state of testcase try: tcappstate = ldtpelements.getElementsByTagName ("appstate")[0] tcappstatename = getText (tcappstate.childNodes) tcappstatename = getFullPath(tcappstatename) except IndexError: ldtp.log ('Not found Appstate', 'info') g_prj_tcappstatename = None else: g_prj_tcappstatename = tcappstatename # print 'Executing group ' + groupelements.nodeName + str (i) if groupname != None and groupname.parentNode == groupelements: ldtp.log (getText (groupname.childNodes), groupstart) else: ldtp.log (groupelements.nodeName + str (i), groupstart) scriptPassCount = 0 totalScripts = 0 _startTime = time.time () _startLocalTime = time.strftime ('%H:%M:%S %p on %d-%b-%Y', time.localtime ()) # Run TestCaseEnter and Appstate before to execute every group g_prj_exception = False g_prj_casestate = None if g_prj_tccaseentername: g_prj_casestate = TESTCASESTATE.TCS_ENTERING try: ldtp.log ('TestCase Enter is: %s' % g_prj_tccaseentername, 'info') execfile(g_prj_tccaseentername) except: ldtp.log('Failed in TestCase Enter', 'info') ldtp.log (traceback.format_exc(), 'error') if g_prj_tcappstatename: try: ldtp.log ('Entering AppState is: %s' % g_prj_tcappstatename, 'info') execfile(g_prj_tcappstatename) except: ldtp.log('Failed in Entering AppState', 'info') ldtp.log (traceback.format_exc(), 'error') try: if testcaseid != None: g_prj_tcID = getText (testcaseid.childNodes) ldtp.log (g_prj_tcID, 'testcaseid') print ("Running testcaseid %s" % g_prj_tcID) if comment != None: ldtp.log (getText (comment.childNodes), 'comment') scriptPassCount, totalScripts = executescript (groupelements) if scriptPassCount == totalScripts: _groupScriptPassCount += 1 _groupTestcaseCount += 1 ldtp.log ('start=\"' + str (_startLocalTime) + '\" elapsed=\"' + getElapsedTime (time.time (), _startTime) + '\"', 'timeinfo') except KeyboardInterrupt: ldtp.log ('start=\"' + str (_startLocalTime) + '\" elapsed=\"' + getElapsedTime (time.time (), _startTime) + '\"', 'timeinfo') if groupname != None and groupname.parentNode == groupelements: ldtp.log (getText (groupname.childNodes), groupend) else: ldtp.log (groupelements.nodeName + str (i), groupend) raise KeyboardInterrupt () # Run TestCaseExit and Appstate after executed every group if g_prj_tcappstatename: g_prj_casestate = TESTCASESTATE.TCS_EXITING try: ldtp.log ('Exiting AppState is: %s' % g_prj_tcappstatename, 'info') execfile(g_prj_tcappstatename) except: ldtp.log('Failed in Exiting AppState', 'info') ldtp.log (traceback.format_exc(), 'error') if g_prj_tccaseexitname: g_prj_casestate = TESTCASESTATE.TCS_EXITING try: ldtp.log ('TestCase Exit is: %s' % g_prj_tccaseexitname, 'info') execfile(g_prj_tccaseexitname) except: ldtp.log('Failed in TestCase Exit.', 'info') ldtp.log (traceback.format_exc(), 'error') ldtp.log ('total=\"' + str (totalScripts) + '\" pass=\"' + str (scriptPassCount) + \ '\" fail=\"' + str (totalScripts - scriptPassCount) + '\"', 'groupsstatus') if groupname != None and groupname.parentNode == groupelements: ldtp.log (getText (groupname.childNodes), groupend) else: ldtp.log (groupelements.nodeName + str (i), groupend) i = i + 1 return _groupScriptPassCount, _groupTestcaseCountdef getElapsedTime (_endTime, _startTime): timeDiff = _endTime - _startTime seconds = int (timeDiff % 60) minutes = int (timeDiff / 60) hours = int (minutes % 60) days = 0 fmt = '' if hours > 24: days = int (hours / 24) fmt = str (days) + ' day(s) ' fmt = fmt + str (hours) + ':' + str (minutes) + ':' + str (seconds) return fmtdef executescript (groupelements): global g_prj_exception global scriptLevelTimeinfo scripts = groupelements.getElementsByTagName ('script') scriptPassCount = 0 totalScripts = len (scripts) for scriptelements in scripts: scriptname = '' scriptdata = '' try: name = scriptelements.getElementsByTagName ('name')[0] except IndexError: # print 'Script file entry not present - skipping' ldtp.log ('Script file entry not present - skipping', 'info') continue scriptname = getText (name.childNodes) try: data = scriptelements.getElementsByTagName ('data')[0] scriptdata = getText (data.childNodes) except IndexError: ldtp.log ('Data file maynot be present') scriptglobal = dict ({'datafilename' : ''}) if scriptdata != '': ldtp.log (scriptname, 'scriptstart') ldtp.log (scriptdata, 'datafilename') scriptglobal = dict ({'datafilename' : scriptdata}) else: ldtp.log (scriptname, 'scriptstart') ldtp.log ('data xml tag missing', 'info') print 'Executing script: %s - data: %s' % (scriptname, scriptdata) try: appmapfile = scriptelements.getElementsByTagName ('appmapfile')[0] appmapfilename = getText (appmapfile.childNodes) appmapfilename = getFullPath(appmapfilename) # print 'Appmap file name: ' + appmapfilename ldtp.log ('appmap file name ' + appmapfilename, 'info') ldtp.initappmap (appmapfilename) except IndexError: # print 'Log file entry not present' pass except ldtp.LdtpExecutionError, msg: # print 'appmap could not be initalize ' + str (msg) ldtp.log ('Appmap could not be initalized ' + str (msg), 'error') _startTime = time.time () _startLocalTime = time.strftime ('%H:%M:%S %p on %d-%b-%Y', time.localtime ()) try: scriptname = getFullPath(scriptname) execfile (scriptname, scriptglobal) if scriptLevelTimeinfo == True: ldtp.log ('start=\"' + str (_startLocalTime) + '\" elapsed=\"' + getElapsedTime (time.time (), _startTime) + '\"', 'timeinfo') scriptPassCount = scriptPassCount + 1 except ldtp.LdtpExecutionError, ErrorMsg: if scriptLevelTimeinfo == True: ldtp.log ('start=\"' + str (_startLocalTime) + '\" elapsed=\"' + getElapsedTime (time.time (), _startTime) + '\"', 'timeinfo') msg = str (ErrorMsg) # Escape unicode message replacequotes = re.compile ('\'u\"') msg = replacequotes.sub ('', msg) # Escape single quotes and dobule quotes replacequotes = re.compile ('\'\"') msg = replacequotes.sub ('', msg) # print msg ldtp.log (traceback.format_exc(), 'error') ldtp.log (msg, 'cause') ldtp.log (scriptname, 'scriptend') break except IOError: ldtp.log ('Script \"' + scriptname + '\" not found', 'error') ldtp.log (scriptname, 'scriptend') break except KeyboardInterrupt: if scriptLevelTimeinfo == True: ldtp.log ('start=\"' + str (_startLocalTime) + '\" elapsed=\"' + getElapsedTime (time.time (), _startTime) + '\"', 'timeinfo') #ldtp.log (scriptname, 'scriptend') raise KeyboardInterrupt () except: g_prj_exception = True ldtp.log (traceback.format_exc (), 'error') if scriptLevelTimeinfo == True: ldtp.log ('start=\"' + str (_startLocalTime) + '\" elapsed=\"' + getElapsedTime (time.time (), _startTime) + '\"', 'timeinfo') ldtp.log (scriptname, 'scriptend') break ldtp.log (scriptname, 'scriptend') return scriptPassCount, totalScriptsdef enable_accessibility(): global old_accessibility_value old_accessibility_value = commands.getoutput('gconftool-2 --get ' + '/desktop/gnome/interface'+ '/accessibility') if old_accessibility_value == 'true': return # accessibility is enabled if commands.getstatusoutput ('gconftool-2 --set --type bool /desktop/gnome' + '/interface/accessibility true')[0] != 0: raise ldtp.LdtpExecutionError ('Accessibility not enabled') def replace_accessibility(): global old_accessibility_value if old_accessibility_value == 'true': return if commands.getstatusoutput ('gconftool-2 --set --type bool /desktop/gnome' + '/interface/accessibility false')[0] != 0: raise ldtp.LdtpExecutionError ('Unable to reset Accessibility') # Add current working directory to pathsys.path = sys.path + ['.']# Change to current working directoryos.chdir (os.getcwdu ())# Check accessibility, if not enabled, then enable itold_accessibility_value = 'false'enable_accessibility()# Added user's configuration file, which uses python logging module and configuration formatif filename != None: ldtp.addlogger (filename)# Execute LDTP runner XML fileexecuteldtp (dom)# Restore the previous accessibility statereplace_accessibility()