2
#############################################################################
4
# Linux Desktop Testing Project http://ldtp.freedesktop.org
9
# Nagappan Alagappan <nagappan@gmail.com>
11
# Copyright 2005 - 2006 Novell, Inc.
12
# Copyright 2008-2009 Nagappan Alagappan
14
# This program is free software; you can redistribute it and/or
15
# modify it under the terms of the GNU Lesser General Public
16
# License as published by the Free Software Foundation; either
17
# version 2 of the License, or (at your option) any later version.
19
# This program is distributed in the hope that it will be useful,
20
# but WITHOUT ANY WARRANTY; without even the implied warranty of
21
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22
# Lesser General Public License for more details.
24
# You should have received a copy of the GNU Lesser General Public
25
# License along with this program; if not, write to the
26
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
27
# Boston, MA 02110, USA.
29
#############################################################################
31
__author__ = "Nagappan Alagappan <nagappan@gmail.com>"
32
# __maintainer__ = "Nagappan Alagappan <nagappan@gmail.com>"
42
import xml.dom.minidom
44
from optparse import OptionParser
49
scriptLevelTimeinfo = False
51
class TESTCASESTATE (object):
56
scriptLevelTimeinfo = False
58
g_prj_tccaseentername = None
59
g_prj_tccaseexitname = None
60
g_prj_tcappstatename = None
61
g_prj_exception = False
62
g_prj_casestate = None
64
# Add current working directory to path
65
sys.path = sys.path + ['.']
66
# Change to current working directory
67
os.chdir (os.getcwdu ())
69
def getText (nodelist):
72
if node.nodeType == node.TEXT_NODE:
76
def executeldtp (ldtpxmldata):
77
global g_prj_tccaseentername, g_prj_tccaseexitname
78
if ldtpxmldata == None:
79
raise ldtp.LdtpExecutionError ('ldtpxmldata tag not present')
81
ldtpxml = ldtpxmldata.getElementsByTagName ('ldtp')
83
ldtp.log ('ldtp xml tag not present')
84
print 'ldtp xml tag not present'
89
for ldtpelements in ldtpxml:
91
logfileoverwrite = ldtpelements.getElementsByTagName ('logfileoverwrite')[0]
92
logfileupdate = getText (logfileoverwrite.childNodes)
94
logfileappend = int (logfileupdate)
96
# print 'Log file append status not integer value - ' + logfileupdate
97
log ('Log file append status not integer value - '
98
+ logfileupdate, 'warning')
100
# print 'Log append - ' + logfileappend
102
# print 'Log file overwrite not present'
105
logconf = ldtpelements.getElementsByTagName ('logconf')[0]
106
logConfFile = getText (logconf.childNodes)
107
ldtp.addlogger (logConfFile)
109
# print 'Log configuration file'
112
screenshotDir = ldtpelements.getElementsByTagName ('screenshotdir')[0]
113
screenshotDir = getText (screenshotDir.childNodes)
115
# print 'Screenshot directory entry missing'
118
logfile = ldtpelements.getElementsByTagName ('logfile')[0]
119
logfilename = getText (logfile.childNodes)
120
logfilename = ldtputils.getFullPath (logfilename)
121
ldtp.startlog (logfilename, int (logfileappend), screenshotDir)
122
# print 'Log file name - ' + logfilename + ' - overwrite - ' + str (int (logfileappend))
124
# print 'Log file entry not present'
127
loglevel = ldtpelements.getElementsByTagName ('loglevel')[0]
128
logLevel = getText (loglevel.childNodes)
129
ldtp.setloglevel (logLevel)
131
# print 'Log level entry not present'
134
appmapfile = ldtpelements.getElementsByTagName ('appmapfile')[0]
135
appmapfilename = getText (appmapfile.childNodes)
136
appmapfilename = ldtputils.getFullPath (appmapfilename)
137
# print 'Appmap file name: ' + appmapfilename
138
ldtp.log ('appmap file name ' + appmapfilename, 'info')
139
ldtp.initappmap (appmapfilename)
141
# print 'Appmap file entry not present'
143
except ldtp.LdtpExecutionError, msg:
144
# print 'appmap could not be initalize ' + msg.value
145
ldtp.log ('Appmap could not be initalized %s' % msg.value, 'error')
147
appUnderTest = ldtpelements.getElementsByTagName ('appundertest')[0]
148
appUnderTest = getText (appUnderTest.childNodes)
149
ldtp.appundertest (appUnderTest)
151
# print 'Application Under Test entry missing'
154
# Check the tag for case enter and exit
156
tcenter = ldtpelements.getElementsByTagName ("caseenter")[0]
157
tcentername = getText (tcenter.childNodes)
158
tcentername = ldtputils.getFullPath(tcentername)
160
ldtp.log ('Not use TestCase Enter', 'info')
162
g_prj_tccaseentername = tcentername
164
tcexit = ldtpelements.getElementsByTagName ("caseexit")[0]
165
tcexitname = getText (tcexit.childNodes)
166
tcexitname = ldtputils.getFullPath(tcexitname)
168
ldtp.log ('Not use TestCase Exit', 'info')
170
g_prj_tccaseexitname = tcexitname
173
executecategories (ldtpelements)
174
except KeyboardInterrupt:
176
if logfilename != '':
179
def executecategories (ldtpelements):
180
categories = ldtpelements.getElementsByTagName ('category')
182
executegroup (ldtpelements)
185
_categoryTestcaseCount = 0
186
_categoryScriptPassCount = 0
187
_startTime = time.time ()
188
_startLocalTime = time.strftime ('%H:%M:%S %p on %d-%b-%Y', time.localtime ())
189
for categoryelements in categories:
192
categoryname = categoryelements.getElementsByTagName ('name')[0]
194
# print 'Script file entry not present - skipping'
195
ldtp.log ('categoryname entry not present - skipping', 'info')
196
if categoryname != None and categoryname.parentNode == categoryelements:
197
ldtp.log (getText (categoryname.childNodes), 'categorystart')
199
ldtp.log (categoryelements.nodeName + str (i), 'categorystart')
200
scriptPassCount, totalScripts = executegroup (categoryelements)
201
_categoryScriptPassCount += scriptPassCount
202
_categoryTestcaseCount += totalScripts
203
if categoryname != None and categoryname.parentNode == categoryelements:
204
ldtp.log (getText (categoryname.childNodes), 'categoryend')
206
ldtp.log ('Executing ' + categoryelements.nodeName + str (i), 'categoryend')
208
ldtp.log ('start="%s" elapsed="%s"' % (str (_startLocalTime),
209
getElapsedTime (time.time (),
212
ldtp.log ('total="%s" pass="%s" fail="%s"'% (str (_categoryTestcaseCount),
213
str (_categoryScriptPassCount),
214
str (_categoryTestcaseCount - _categoryScriptPassCount)),
217
def executegroup (ldtpelements):
218
global g_prj_tcID, g_prj_exception, g_prj_casestate
219
global g_prj_tccaseentername, g_prj_tccaseexitname, g_prj_tcappstatename
220
global scriptLevelTimeinfo
221
if ldtpelements is None:
222
raise ldtp.LdtpExecutionError ('Atleast one group tag should be present')
223
groups = ldtpelements.getElementsByTagName ('group')
225
raise ldtp.LdtpExecutionError ('Atleast one group tag should be present')
226
groupstart = 'groupstart'
227
groupend = 'groupend'
229
_groupTestcaseCount = 0
230
_groupScriptPassCount = 0
231
global scriptLevelTimeinfo
232
for groupelements in groups:
237
testcaseid = groupelements.getElementsByTagName ('testcaseid')[0]
239
# print 'Script file tag not present - skipping'
240
ldtp.log ('testcaseid tag not present - skipping', 'info')
242
groupname = groupelements.getElementsByTagName ('name')[0]
244
# print 'Script file tag not present - skipping'
245
ldtp.log ('groupname tag not present - skipping', 'info')
247
_scriptLevelTimeInfo = groupelements.getElementsByTagName ('scripttimeinfo')[0]
249
if int (getText (_scriptLevelTimeInfo.childNodes)) == 1:
250
scriptLevelTimeinfo = True
256
comment = groupelements.getElementsByTagName ('comment')[0]
258
# print 'Script file tag not present - skipping'
259
ldtp.log ('comment tag not present - skipping', 'info')
260
# Check the tag for the state of testcase
262
tcappstate = groupelements.getElementsByTagName ("appstate")[0]
263
tcappstatename = getText (tcappstate.childNodes)
264
tcappstatename = ldtputils.getFullPath(tcappstatename)
266
ldtp.log ('appstate tag not present', 'info')
267
g_prj_tcappstatename = None
269
g_prj_tcappstatename = tcappstatename
271
# print 'Executing group ' + groupelements.nodeName + str (i)
272
if groupname != None and groupname.parentNode == groupelements:
273
ldtp.log (getText (groupname.childNodes), groupstart)
275
ldtp.log (groupelements.nodeName + str (i), groupstart)
278
_startTime = time.time ()
279
_startLocalTime = time.strftime ('%H:%M:%S %p on %d-%b-%Y', time.localtime ())
280
# Run TestCaseEnter and Appstate before to execute every group
281
g_prj_exception = False
282
g_prj_casestate = None
283
if g_prj_tccaseentername:
284
g_prj_casestate = TESTCASESTATE.TCS_ENTERING
286
ldtp.log ('TestCase Enter is: %s' % g_prj_tccaseentername, 'info')
287
execfile (g_prj_tccaseentername)
289
ldtp.log ('Failed in TestCase Enter', 'info')
290
if hasattr (traceback, 'format_exc'):
291
ldtp.log (traceback.format_exc (), 'error')
293
ldtp.log (traceback.print_exc (), 'error')
295
if g_prj_tcappstatename:
297
ldtp.log ('Entering AppState is: %s' % g_prj_tcappstatename, 'info')
298
execfile(g_prj_tcappstatename)
300
ldtp.log('Failed in Entering AppState', 'info')
301
if hasattr (traceback, 'format_exc'):
302
ldtp.log (traceback.format_exc (), 'error')
304
ldtp.log (traceback.print_exc (), 'error')
307
appUnderTest = groupelements.getElementsByTagName ('appundertest')[0]
308
appUnderTest = getText (appUnderTest.childNodes)
309
ldtp.appundertest (appUnderTest)
311
# print 'Application Under Test entry missing'
315
if testcaseid != None:
316
ldtp.log (getText (testcaseid.childNodes), 'testcaseid')
318
ldtp.log (getText (comment.childNodes), 'comment')
319
scriptPassCount, totalScripts = executescript (groupelements)
320
if scriptPassCount == totalScripts:
321
_groupScriptPassCount += 1
322
_groupTestcaseCount += 1
323
ldtp.log ('start="%s" elapsed="%s"' % (str (_startLocalTime),
324
getElapsedTime (time.time (),
327
except KeyboardInterrupt:
328
ldtp.log ('start="%s" elapsed="%s"' % (str (_startLocalTime),
329
getElapsedTime (time.time (),
332
if groupname != None and groupname.parentNode == groupelements:
333
ldtp.log (getText (groupname.childNodes), groupend)
335
ldtp.log (groupelements.nodeName + str (i), groupend)
337
# Run TestCaseExit and Appstate after executed every group
338
if g_prj_tcappstatename:
339
g_prj_casestate = TESTCASESTATE.TCS_EXITING
341
ldtp.log ('Exiting AppState is: %s' % g_prj_tcappstatename, 'info')
342
execfile (g_prj_tcappstatename)
344
ldtp.log ('Failed in Exiting AppState', 'info')
345
if hasattr (traceback, 'format_exc'):
346
ldtp.log (traceback.format_exc (), 'error')
348
ldtp.log (traceback.print_exc (), 'error')
349
if g_prj_tccaseexitname:
350
g_prj_casestate = TESTCASESTATE.TCS_EXITING
352
ldtp.log ('TestCase Exit is: %s' % g_prj_tccaseexitname, 'info')
353
execfile (g_prj_tccaseexitname)
355
ldtp.log('Failed in TestCase Exit.', 'info')
356
if hasattr (traceback, 'format_exc'):
357
ldtp.log (traceback.format_exc (), 'error')
359
ldtp.log (traceback.print_exc (), 'error')
361
ldtp.log ('total="%s" pass="%s" fail="%s"'% (str (totalScripts),
362
str (scriptPassCount),
363
str (totalScripts - scriptPassCount)),
365
if groupname != None and groupname.parentNode == groupelements:
366
ldtp.log (getText (groupname.childNodes), groupend)
368
ldtp.log (groupelements.nodeName + str (i), groupend)
370
return _groupScriptPassCount, _groupTestcaseCount
372
def getElapsedTime (_endTime, _startTime):
373
timeDiff = _endTime - _startTime
375
hourbaseon = minbaseon*60
376
daybaseon = hourbaseon*24
377
days = int (timeDiff / daybaseon)
378
hours = int ((timeDiff - days*daybaseon) / hourbaseon)
379
minutes = int ((timeDiff - days * daybaseon - hours * hourbaseon) / minbaseon)
380
seconds = int (timeDiff - days * daybaseon - hours * hourbaseon - minutes * minbaseon)
383
return ('%s day(s) %s:%s:%s' %
384
(str (days), str (hours), str (minutes), str (seconds)))
387
(str (hours), str (minutes), str (seconds)))
389
def executescript (groupelements):
390
global g_prj_exception
391
global scriptLevelTimeinfo
392
if groupelements == None:
393
raise ldtp.LdtpExecutionError ('groupelements value should *NOT* be None')
395
scripts = groupelements.getElementsByTagName ('script')
397
totalScripts = len (scripts)
398
for scriptelements in scripts:
400
scriptDataFileName = ''
403
name = scriptelements.getElementsByTagName ('name')[0]
405
# print 'Script file entry not present - skipping'
406
ldtp.log ('Script file entry not present - skipping', 'warning')
408
scriptFileName = getText (name.childNodes)
410
data = scriptelements.getElementsByTagName ('data')[0]
411
scriptDataFileName = getText (data.childNodes)
413
ldtp.log ('Data file maynot be present')
415
testcase = scriptelements.getElementsByTagName ('testcase')[0]
416
testcasename = getText (testcase.childNodes)
418
ldtp.log ('testcase name maynot be present')
419
scriptglobal = dict ({'datafilename' : ''})
420
if scriptDataFileName != '':
421
ldtp.log (scriptFileName, 'scriptstart')
422
if os.path.exists (scriptDataFileName) == False:
423
scriptDataFileName = "%s/%s" % (baseDir, scriptDataFileName)
424
ldtp.log (scriptDataFileName, 'datafilename')
425
scriptglobal = dict ({'datafilename' : scriptDataFileName})
427
ldtp.log (scriptFileName, 'scriptstart')
428
ldtp.log ('data xml tag missing', 'info')
429
# print 'Executing script: ' + scriptFileName + ' - ' + scriptDataFileName
431
appmapfile = scriptelements.getElementsByTagName ('appmapfile')[0]
432
appmapfilename = getText (appmapfile.childNodes)
433
appmapfilename = ldtputils.getFullPath (appmapfilename)
434
# print 'Appmap file name: ' + appmapfilename
435
ldtp.log ('appmap file name ' + appmapfilename, 'info')
436
ldtp.initappmap (appmapfilename)
438
# print 'Log file entry not present'
440
except ldtp.LdtpExecutionError, msg:
441
# print 'appmap could not be initalize ' + msg.value
442
ldtp.log ('Appmap could not be initalized %s' % msg.value, 'error')
444
appUnderTest = scriptelements.getElementsByTagName ('appundertest')[0]
445
appUnderTest = getText (appUnderTest.childNodes)
446
ldtp.appundertest (appUnderTest)
448
# print 'Application Under Test entry missing'
450
_startTime = time.time ()
451
_startLocalTime = time.strftime ('%H:%M:%S %p on %d-%b-%Y',
453
global scriptLevelTimeinfo
455
if testcasename is not None:
456
ldtp.log (testcasename, 'teststart')
457
scriptName = scriptFileName = ldtputils.getFullPath (scriptFileName)
458
if os.path.exists (scriptName) == False:
459
scriptName = "%s/%s" % (baseDir, scriptName)
460
execfile (scriptName, scriptglobal)
462
if scriptLevelTimeinfo:
463
ldtp.log ('start="%s" elapsed="%s"' % (str (_startLocalTime),
464
getElapsedTime (time.time (),
467
scriptPassCount = scriptPassCount + 1
468
if testcasename is not None:
469
ldtp.log (testcasename, 'pass')
470
ldtp.log (testcasename, 'testend')
471
except ldtp.LdtpExecutionError, ErrorMsg:
472
g_prj_exception = True
473
if scriptLevelTimeinfo:
474
ldtp.log ('start="%s" elapsed="%s"' % (str (_startLocalTime),
475
getElapsedTime (time.time (),
478
msg = ErrorMsg.value# + traceback.print_exc ()
479
# Escape unicode message
480
replacequotes = re.compile ('\'u\"')
481
msg = replacequotes.sub ('', msg)
482
# Escape single quotes and dobule quotes
483
replacequotes = re.compile ('\'\"')
484
msg = replacequotes.sub ('', msg)
486
if hasattr (traceback, 'format_exc'):
487
stackTrace = traceback.format_exc ()
489
stackTrace = traceback.print_exc ()
490
ldtp.log (stackTrace, 'stacktrace')
491
if stackTrace.find ('ldtp.py') == -1 and \
492
stackTrace.find ('ldtputils.py') == -1:
493
# Kind of work around, as ldtp.py and ldtputils.py will log,
494
# the error case as well, so let us log error in that case.
495
ldtp.logFailures (msg) # Will take screenshot as well
496
ldtp.log (msg, 'cause')
497
if testcasename is not None:
498
ldtp.log (testcasename, 'fail')
499
ldtp.log (testcasename, 'testend')
500
ldtp.log (scriptFileName, 'scriptend')
503
if testcasename is not None:
504
ldtp.log (testcasename, 'fail')
505
ldtp.log (testcasename, 'testend')
506
g_prj_exception = True
507
ldtp.log ('Script \"' + scriptFileName + '\" not found', 'error')
508
ldtp.log (scriptFileName, 'scriptend')
510
except KeyboardInterrupt:
511
if testcasename is not None:
512
ldtp.log (testcasename, 'fail')
513
ldtp.log (testcasename, 'testend')
514
if scriptLevelTimeinfo:
515
ldtp.log ('start="%s" elapsed="%s"' % (str (_startLocalTime),
516
getElapsedTime (time.time (),
519
ldtp.log (scriptFileName, 'scriptend')
522
g_prj_exception = True
523
if hasattr (traceback, 'format_exc'):
524
ldtp.log (traceback.format_exc (), 'stacktrace')
526
ldtp.log (traceback.print_exc (), 'stacktrace')
527
if testcasename is not None:
528
ldtp.log (testcasename, 'fail')
529
ldtp.log (testcasename, 'testend')
530
if scriptLevelTimeinfo:
531
ldtp.log ('start="%s" elapsed="%s"' % (str (_startLocalTime),
532
getElapsedTime (time.time (),
535
ldtp.log (scriptFileName, 'scriptend')
537
ldtp.log (scriptFileName, 'scriptend')
538
return scriptPassCount, totalScripts
540
def enable_accessibility ():
541
global old_accessibility_value
542
old_accessibility_value = commands.getoutput('gconftool-2 --get ' +
543
'/desktop/gnome/interface'+
545
if old_accessibility_value == 'true':
546
return # accessibility is enabled
548
if commands.getstatusoutput ('gconftool-2 --set --type bool /desktop/gnome'
549
+ '/interface/accessibility true')[0] != 0:
550
raise ldtp.LdtpExecutionError ('Accessibility not enabled')
552
def replace_accessibility ():
553
global old_accessibility_value
554
if old_accessibility_value == 'true':
556
if commands.getstatusoutput ('gconftool-2 --set --type bool /desktop/gnome'
557
+ '/interface/accessibility false')[0] != 0:
558
raise ldtp.LdtpExecutionError ('Unable to reset Accessibility')
561
# Defining the command line arguments
562
usage = 'Usage:\n %prog [-c CONFIGFILE] [-i IPADDRESS [-p PORT]] xmlfile'
563
parser = OptionParser (usage)
564
parser.add_option ('-c', '--conf', dest='configFile',
565
help = 'Add a log configuration file')
566
parser.add_option ('-i', '--ip', dest='ipAddress',
567
help = 'LDTP engine IP address')
568
parser.add_option ('-p', '--port', dest='port',
569
help='LDTP engine port')
570
(options, args) = parser.parse_args ()
573
parser.error ('Incorrect number of arguments')
575
filename = options.configFile
577
if options.ipAddress != None:
578
os.environ['LDTP_SERVER_ADDR'] = options.ipAddress
579
if options.port != None:
580
os.environ['LDTP_SERVER_PORT'] = options.port
582
xmlFileName = os.path.abspath (args [0])
583
baseDir = xmlFileName [:xmlFileName.rfind ('/') + 1]
586
dom = xml.dom.minidom.parse (xmlFileName)
587
except xml.parsers.expat.ExpatError, msg:
588
print 'XML Error: %s' % msg.value
591
print 'XML "%s" file not found' % xmlFileName
594
if options.ipAddress != None:
595
# Check accessibility, if not enabled, then enable it
596
old_accessibility_value = 'false'
597
enable_accessibility ()
599
# Added user's configuration file, which uses python logging module and configuration format
601
ldtp.addlogger (filename)
603
# Execute LDTP runner XML file
606
if options.ipAddress != None:
607
# Restore the previous accessibility state
608
replace_accessibility ()
610
if __name__ == "__main__":
613
# # call executeldtp (dom) from your script with xml.dom object
615
# dom = xml.dom.minidom.parse (xmlFileName)
616
# except xml.parsers.expat.ExpatError, msg:
617
# print 'XML Error: %s' % msg.value
620
# print 'XML "%s" file not found' % xmlFileName