[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