[Hildon-test-aut-commits] r572 - in trunk/dogtail: dogtail examples
suanand at garage.maemo.org
suanand at garage.maemo.org
Tue Nov 13 00:01:43 EET 2007
Author: suanand
Date: 2007-11-13 00:01:35 +0200 (Tue, 13 Nov 2007)
New Revision: 572
Modified:
trunk/dogtail/dogtail/rocknrole.py
trunk/dogtail/examples/gcalctool-test-fibonacci.py
Log:
checkState checks Dict. assertNotState, python2.4/5 checks for unittest (may need to revisit), removed config, and most importantly the annoying 0.5 seconds sleep for every node found is now removed. rnr is _much_ faster now
Modified: trunk/dogtail/dogtail/rocknrole.py
===================================================================
--- trunk/dogtail/dogtail/rocknrole.py 2007-11-09 10:24:28 UTC (rev 571)
+++ trunk/dogtail/dogtail/rocknrole.py 2007-11-12 22:01:35 UTC (rev 572)
@@ -1,4 +1,4 @@
-#!/usr/bin/python -tt
+#!/usr/bin/python -tt
# vim: sw=4 ts=4 expandtab ai
#########################################################################################
@@ -26,7 +26,6 @@
from dogtail import predicate, tree
from dogtail.config import config
-from dogtail.utils import run as dogrun
from dogtail.rawinput import doubleClick
from dogtail.rawinput import click
from dogtail.rawinput import press
@@ -36,10 +35,7 @@
from threading import Timer
import types
-config.searchWarningThreshold=5
-config.searchCutoffCount=3
-config.defaultDelay=0.4
-config.searchBackoffDuration=3
+searchCutoffCount=3
class RNR:
@@ -263,14 +259,13 @@
self.__timerCallBack.start()
cnt=0
- while cnt < config.searchCutoffCount :
+ while cnt < searchCutoffCount :
foundNode=self.__dooint(rolename, name, action, searchType)
if not foundNode :
sleep(1)
self.refresh()
cnt += 1
else :
- sleep(0.5) # not really required
self.__timerCallBack.cancel()
os.environ['RNRWaitFor']='False'
return foundNode
@@ -296,7 +291,7 @@
self.__timerCallBack.start()
cnt=0
- while cnt < config.searchCutoffCount :
+ while cnt < searchCutoffCount :
try :
foundNode = self.RRlastItem = self.__dict__[rolename][index]
except (KeyError, IndexError):
@@ -307,7 +302,6 @@
self.refresh()
cnt += 1
if foundNode :
- sleep(0.5) # not really required
self.__timerCallBack.cancel()
os.environ['RNRWaitFor']='False'
action and self.__doer(action)
@@ -350,6 +344,8 @@
elif action == 'release':
(x,y) = nodeon.position
release(x,y) # from dogtail.rawinput
+ elif action == 'click':
+ nodeon.click()
else:
nodeon.doAction(action)
if self.refreshFlag : self.refresh() # if ZRefresh is specified e.g. buttonZRefreshClick, then we do refresh, even if node is not found. User requested so we comply.
@@ -480,57 +476,8 @@
class testCaseR(unittest.TestCase):
-
- def run(self, result=None):
- if result is None: result = self.defaultTestResult()
- result.startTest(self)
- #testMethod = getattr(self, self._TestCase__testMethodName)
- testMethod = getattr(self, self._testMethodName)
- try:
- try:
- syslogStart = self.markSyslogStart() # get the start of the syslog for this TC at its setup anycase, because we need it if it fails
- self.setUp()
- except KeyboardInterrupt:
- raise
- except:
- #result.addError(self, self._TestCase__exc_info())
- result.addError(self, self._exc_info())
- return
- ok = False
- try:
- testMethod()
- ok = True
- except self.failureException:
-
- # Taking screenshot of the entire screen when a test case fails
- defaultName='_'.join(self.id().split('.png')[0].split('.')[-2:])
- ssfileName=config.scratchDir + '/' + defaultName.split('.png')[0]+'_fail.png'
- createImage(ssfileName)
- if syslogStart:
- self.writeSyslog(syslogStart)
- #result.addFailure(self, self._TestCase__exc_info())
- result.addFailure(self, self._exc_info())
- except KeyboardInterrupt:
- raise
- except:
- #result.addError(self, self._TestCase__exc_info())
- result.addError(self, self._exc_info())
-
- try:
- self.tearDown()
- except KeyboardInterrupt:
- raise
- except:
- #result.addError(self, self._TestCase__exc_info())
- result.addError(self, self._exc_info())
- ok = False
- if ok: result.addSuccess(self)
- finally:
- result.stopTest(self)
-
def markSyslogStart(self):
- sysLog='/var/ftd-log/syslog'
if os.path.exists(sysLog):
fp=open(sysLog,'r')
fp.seek(0,2) # seek to the last byte of the syslog file
@@ -540,33 +487,142 @@
else:
return False
- def writeSyslog(self,syslogStart):
- sysLog='/var/ftd-log/syslog'
- fp=open(sysLog,'r')
- fp.seek(syslogStart)
- #logFile=config.scratchDir+'/'+self.__class__.__name__+'_'+self._TestCase__testMethodName+'.log'
- logFile=config.scratchDir+'/'+self.__class__.__name__+'_'+self._testMethodName+'.log'
- fo=open(logFile,'w')
- for line in fp.readlines():
- fo.write(line)
- fp.close()
- fo.close()
+ if sys.version_info < (2,5) :
- def shortDescription(self):
- """Overriding shortDescription to print all lines in docstring """
- #return "\t#### Test " + self.__class__.__name__ + '_' + self._TestCase__testMethodName + '\n\t' + str(self._TestCase__testMethodDoc) + '\n\t#### End of description of '+ self._TestCase__testMethodName +' test.\n'
- return "\t#### Test " + self.__class__.__name__ + '_' + self._testMethodName + '\n\t' + str(self._testMethodDoc) + '\n\t#### End of description of '+ self._testMethodName +' test.\n'
+ def run(self, result=None):
+ if result is None: result = self.defaultTestResult()
+ result.startTest(self)
+ testMethod = getattr(self, self._TestCase__testMethodName)
+ try:
+ try:
+ syslogStart = self.markSyslogStart() # get the start of the syslog for this TC at its setup anycase, because we need it if it fails
+ self.setUp()
+ except KeyboardInterrupt:
+ raise
+ except:
+ result.addError(self, self._TestCase__exc_info())
+ return
+ ok = False
+ try:
+ testMethod()
+ ok = True
+ except self.failureException:
+ # Taking screenshot of the entire screen when a test case fails
+ defaultName='_'.join(self.id().split('.png')[0].split('.')[-2:])
+ ssfileName=config.scratchDir + '/' + defaultName.split('.png')[0]+'_fail.png'
+ createImage(ssfileName)
+ if syslogStart:
+ self.writeSyslog(syslogStart)
+ result.addFailure(self, self._TestCase__exc_info())
+ except KeyboardInterrupt:
+ raise
+ except:
+ result.addError(self, self._TestCase__exc_info())
+ try:
+ self.tearDown()
+ except KeyboardInterrupt:
+ raise
+ except:
+ result.addError(self, self._TestCase__exc_info())
+ ok = False
+ if ok: result.addSuccess(self)
+ finally:
+ result.stopTest(self)
+
+ def writeSyslog(self,syslogStart):
+ fp=open(sysLog,'r')
+ fp.seek(syslogStart)
+ logFile=config.scratchDir+'/'+self.__class__.__name__+'_'+self._TestCase__testMethodName+'.log'
+ fo=open(logFile,'w')
+ for line in fp.readlines():
+ fo.write(line)
+ fp.close()
+ fo.close()
+
+ def shortDescription(self):
+ """Overriding shortDescription to print all lines in docstring """
+ return "\t#### Test " + self.__class__.__name__ + '_' + self._TestCase__testMethodName + '\n\t' + str(self._TestCase__testMethodDoc) + '\n\t#### End of description of '+ self._TestCase__testMethodName +' test.\n'
+
+ else : # Python2.5
+
+ def run(self, result=None):
+ if result is None: result = self.defaultTestResult()
+ result.startTest(self)
+ testMethod = getattr(self, self._testMethodName)
+ try:
+ try:
+ syslogStart = self.markSyslogStart() # get the start of the syslog for this TC at its setup anycase, because we need it if it fails
+ self.setUp()
+ except KeyboardInterrupt:
+ raise
+ except:
+ result.addError(self, self._exc_info())
+ return
+
+ ok = False
+ try:
+ testMethod()
+ ok = True
+ except self.failureException:
+
+ # Taking screenshot of the entire screen when a test case fails
+ defaultName='_'.join(self.id().split('.png')[0].split('.')[-2:])
+ ssfileName=config.scratchDir + '/' + defaultName.split('.png')[0]+'_fail.png'
+ createImage(ssfileName)
+ if syslogStart:
+ self.writeSyslog(syslogStart)
+ result.addFailure(self, self._exc_info())
+ except KeyboardInterrupt:
+ raise
+ except:
+ result.addError(self, self._exc_info())
+ try:
+ self.tearDown()
+ except KeyboardInterrupt:
+ raise
+ except:
+ result.addError(self, self._exc_info())
+ ok = False
+ if ok: result.addSuccess(self)
+ finally:
+ result.stopTest(self)
+
+ def writeSyslog(self,syslogStart):
+ fp=open(sysLog,'r')
+ fp.seek(syslogStart)
+ logFile=config.scratchDir+'/'+self.__class__.__name__+'_'+self._testMethodName+'.log'
+ fo=open(logFile,'w')
+ for line in fp.readlines():
+ fo.write(line)
+ fp.close()
+ fo.close()
+
+ def shortDescription(self):
+ """Overriding shortDescription to print all lines in docstring """
+ return "\t#### Test " + self.__class__.__name__ + '_' + self._testMethodName + '\n\t' + str(self._testMethodDoc) + '\n\t#### End of description of '+ self._testMethodName +' test.\n'
+
+
""" Asserts if infobanner comes up; may not work properly if infobanner goes off before the node is stored as an RNR object's attribute """
assertInfoBanner=lambda self, name : self.assert_(RNR(tree.root.application('hildon_desktop')).doon('label', name), 'InfoBanner \'%s\' not found' % name)
""" Asserts if passed states are present in node's stateSet """
- def assertState(self, node, *states) :
- ret, msg = checkState(node, *states)
+ def assertState(self, node, *states):
+ ret, msg = checkState(node, {'states':states})
self.assert_(ret, msg)
print msg
+ def assertNotState(self, node, *notstates):
+ ret, msg = checkState(node, {'notstates':notstates})
+ self.assert_(ret, msg)
+ print msg
+
+ def assertStateDict(self, node, statesDict={}) :
+ ret, msg = checkState(node, statesDict)
+ self.assert_(ret, msg)
+ print msg
+
# TODO - compare extents also for screenshot. append extents to filename and compare it at runtime with node's extents.
if os.environ.has_key('TAKEIMAGE') and os.environ['TAKEIMAGE'] == 'TRUE':
def assertImage(self, node=None, screenshot=None):
@@ -578,7 +634,10 @@
else :
screenshot=defaultName
- if not os.path.isdir(config.scratchDir) : raise LookupError
+ if not os.path.isdir(config.scratchDir) :
+ print config.scratchDir, " config.scratchDir does not exist"
+ raise LookupError
+
fileName=config.scratchDir + '/' + screenshot.split('.png')[0]+'_exp.png'
createImage(fileName, node)
else:
@@ -595,13 +654,17 @@
print config.scratchDir, " config.scratchDir does not exist"
raise LookupError
+ expected=config.scratchDir + '/' + screenshot.split('.png')[0]+'_exp.png'
+ if not os.path.isfile(expected) :
+ print "\nExpected image %s does not exist" % expected
+ raise LookupError
+
actual=config.scratchDir + '/' + screenshot.split('.png')[0]+'.png'
- expected=config.scratchDir + '/' + screenshot.split('.png')[0]+'_exp.png'
diff=config.scratchDir + '/' + screenshot.split('.png')[0]+'_diff.png'
if createImage(actual, node):
# Image comparison using compare of IM through Dogtail
result = tc.TCImage().compare(screenshot, baseline=expected, undertest=actual, dfile=diff, metric='MAE', threshold=1)
- self.assert_(result.has_key(screenshot) and result[screenshot].startswith('Passed'), 'Image is not the same as expected')
+ self.assert_(result.has_key(screenshot) and result[screenshot].startswith('Passed'), 'Image is not the same as expected\nexp = %s, actual = %s, diff = %s' % (expected, actual, diff))
print "image is same as expected, exp = %s, actual = %s, diff = %s" % (expected, actual, diff)
@@ -643,7 +706,7 @@
raise ValueError, "Failed to save screenshot in png format"
'''
- # TODO To be uncommented when gobject is included in python2.4 or python2.5 is used
+ # TODO To be uncommented when gobject is included in python2.4 env. or python2.5 is used
except gobject.GError :
raise ValueError, "Failed to save screenshot in png format"
'''
@@ -652,27 +715,48 @@
print "Took image " + fileName
return True
-statesDict={}
-for k,v in [(key,val) for (key,val) in atspi.__dict__.iteritems() if key.find('STATE') != -1] : statesDict[v]=k.replace('SPI_STATE_','')
-
-def checkState(node, *states):
+def checkState(node, statesDict):
"""
Checks if node is in given states. Even if one state is not present then check fails
Returns tuple of two elements - 1st:Result Status(True/False) , 2nd:Result String
"""
- stat=True ; failedStates=[]
+
+ states=[]
+ notstates=[]
+ try : states=statesDict['states']
+ except KeyError : pass
+ try : notstates=statesDict['notstates']
+ except KeyError : pass
+
+ for lstate in states, notstates :
+ if types.StringType == type(lstate) :
+ lstatelist = []
+ lstatelist.append(lstate)
+ if lstate == states : states=lstatelist
+ else : notstates=lstatelist
+
+ stat=True ; failedStates=[]; failedNotStates=[]
for state in states :
if not node.stateSet.contains(atspi.__getattribute__('_'.join(('SPI_STATE',state.upper())))) :
stat=False
failedStates.append(state)
+ for state in notstates :
+ if node.stateSet.contains(atspi.__getattribute__('_'.join(('SPI_STATE',state.upper())))) :
+ stat=False
+ failedNotStates.append(state)
stateSetList=str(node.stateSet).lstrip('[ ').rstrip('] ').split(',') # cannot iterate over stateSet as-is !!
presentStates=[]
- for i in stateSetList : presentStates.append(statesDict[int(i)].lower())
+ for i in stateSetList : presentStates.append(allStatesDict[int(i)].lower())
- msgstr=' ; Node\'s stateSet='+ str(node.stateSet) + '-' + ",".join(presentStates)
+ msgstr='\n\tNode\'s stateSet='+ str(node.stateSet) + '-' + ",".join(presentStates)
if not stat :
- return (False, '\n\tNode not ' + ','.join(failedStates) + msgstr+'\n\t('+str(node)+')')
+ return (False, '\n\tStates Failed : ' + ','.join(failedStates) + '\n\tNot-In-States Failed : ' + ','.join(failedNotStates) + msgstr+'\n\t('+str(node)+')')
else:
- return (True, '\n\tNode is ' + ','.join(states) + msgstr+'\n\t('+str(node)+')')
+ return (True, '\n\tPresent States Checked : ' + ','.join(states) + '\n\tNot-Present States Checked : ' + ','.join(notstates) + msgstr+'\n\t('+str(node)+')')
+
+allStatesDict={}
+for k,v in [(key,val) for (key,val) in atspi.__dict__.iteritems() if key.find('STATE') != -1] : allStatesDict[v]=k.replace('SPI_STATE_','')
+
+sysLog='/var/ftd-log/syslog'
Modified: trunk/dogtail/examples/gcalctool-test-fibonacci.py
===================================================================
--- trunk/dogtail/examples/gcalctool-test-fibonacci.py 2007-11-09 10:24:28 UTC (rev 571)
+++ trunk/dogtail/examples/gcalctool-test-fibonacci.py 2007-11-12 22:01:35 UTC (rev 572)
@@ -26,5 +26,6 @@
a=b
b=int(gcalctool.getText())
+ if b > 1000 : break
More information about the Hildon-test-aut-commits
mailing list