[Erp5-report] r32881 jm - /erp5/trunk/products/CMFActivity/tests/testCMFActivity.py

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Feb 19 18:56:32 CET 2010


Author: jm
Date: Fri Feb 19 18:56:32 2010
New Revision: 32881

URL: http://svn.erp5.org?rev=32881&view=rev
Log:
CMFActivity: add unit test to check number of executions of failing activities

This test does more than test_6[89]_ so it replaces them.

Modified:
    erp5/trunk/products/CMFActivity/tests/testCMFActivity.py

Modified: erp5/trunk/products/CMFActivity/tests/testCMFActivity.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/tests/testCMFActivity.py?rev=32881&r1=32880&r2=32881&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/tests/testCMFActivity.py [utf8] (original)
+++ erp5/trunk/products/CMFActivity/tests/testCMFActivity.py [utf8] Fri Feb 19 18:56:32 2010
@@ -714,41 +714,6 @@
     self.assertEquals(o.getTitle(), 'a')
     self.assertEquals(portal_activities.countMessageWithTag('toto'), 0)
 
-  def TryConflictErrorsWhileProcessing(self, activity):
-    """Try to execute active objects which may throw conflict errors
-    while processing, and check if they are still executed."""
-    # Make sure that no active object is installed.
-    activity_tool = self.getPortal().portal_activities
-    activity_tool.manageClearActivities(keep=0)
-
-    # Need an object.
-    organisation_module = self.getOrganisationModule()
-    if not organisation_module.hasContent(self.company_id):
-      organisation_module.newContent(id=self.company_id)
-    o = organisation_module._getOb(self.company_id)
-    get_transaction().commit()
-    self.flushAllActivities(silent = 1, loop_size = 10)
-    self.assertEquals(len(activity_tool.getMessageList()), 0)
-
-    # Monkey patch Organisation to induce conflict errors artificially.
-    o.foobar = 0
-    def induceConflictErrors(self, limit):
-      if self.__class__.current_num_conflict_errors < limit:
-        self.__class__.current_num_conflict_errors += 1
-        raise ConflictError
-      else:
-        self.foobar += 1
-    Organisation.induceConflictErrors = induceConflictErrors
-
-    # Test some range of conflict error occurences.
-    for i in xrange(10):
-      Organisation.current_num_conflict_errors = 0
-      o.activate(activity = activity).induceConflictErrors(i)
-      get_transaction().commit()
-      self.flushAllActivities(silent = 1, loop_size = i + 10)
-      self.assertEquals(len(activity_tool.getMessageList()), 0)
-    self.assertEqual(o.foobar, 10)
-
   def TryConflictErrorsWhileValidating(self, activity):
     """Try to execute active objects which may throw conflict errors
     while validating, and check if they are still executed."""
@@ -1676,27 +1641,64 @@
     get_transaction().commit()
     self.assertEquals(len(activity_tool.getMessageList()), 0)
 
-  def test_68_TestConflictErrorsWhileProcessingWithSQLDict(self, quiet=0, run=run_all_test):
-    """
-      Test if conflict errors spoil out active objects with SQLDict.
-    """
-    if not run: return
-    if not quiet:
-      message = '\nTest Conflict Errors While Processing With SQLDict'
+  def test_68_RetryMessageExecution(self, quiet=0):
+    if not quiet:
+      message = '\nCheck number of executions of failing activities'
       ZopeTestCase._print(message)
       LOG('Testing... ', 0, message)
-    self.TryConflictErrorsWhileProcessing('SQLDict')
-
-  def test_69_TestConflictErrorsWhileProcessingWithSQLQueue(self, quiet=0, run=run_all_test):
-    """
-      Test if conflict errors spoil out active objects with SQLQueue.
-    """
-    if not run: return
-    if not quiet:
-      message = '\nTest Conflict Errors While Processing With SQLQueue'
-      ZopeTestCase._print(message)
-      LOG('Testing... ', 0, message)
-    self.TryConflictErrorsWhileProcessing('SQLQueue')
+    activity_tool = self.portal.portal_activities
+    self.assertFalse(activity_tool.getMessageList())
+    exec_count = [0]
+    # priority does not matter anymore
+    priority = random.Random().randint
+    def doSomething(self, retry_list):
+      i = exec_count[0]
+      exec_count[0] = i + 1
+      conflict, edit_kw = retry_list[i]
+      if edit_kw:
+        self.getActivityRuntimeEnvironment().edit(**edit_kw)
+      if conflict is not None:
+        raise conflict and ConflictError or Exception
+    def check(retry_list):
+      fail = retry_list[-1][0] is not None and 1 or 0
+      for activity in 'SQLDict', 'SQLQueue':
+        exec_count[0] = 0
+        activity_tool.activate(activity=activity, priority=priority(1,6)) \
+                     .doSomething(retry_list)
+        get_transaction().commit()
+        self.flushAllActivities(silent=1)
+        self.assertEqual(len(retry_list), exec_count[0])
+        self.assertEqual(fail, len(activity_tool.getMessageList()))
+        self.portal.portal_activities.manageCancel(
+          activity_tool.getPhysicalPath(), 'doSomething')
+    activity_tool.__class__.doSomething = doSomething
+    try:
+      ## Default behaviour
+      # Usual successful case: activity is run only once
+      check([(None, None)])
+      # Usual error case: activity is run 6 times before being frozen
+      check([(False, None)] * 6)
+      # On ConflictError, activity is reexecuted without increasing retry count
+      check([(True, None)] * 10 + [(None, None)])
+      check([(True, None), (False, None)] * 6)
+      ## Customized behaviour
+      # Do not retry
+      check([(False, {'max_retry': 0})])
+      # ... even in case of ConflictError
+      check([(True, {'max_retry': 0}),
+             (True, {'max_retry': 0, 'conflict_retry': 0})])
+      # Customized number of retries
+      for n in 3, 9:
+        check([(False, {'max_retry': n})] * n + [(None, None)])
+        check([(False, {'max_retry': n})] * (n + 1))
+      # Infinite retry
+      for n in 3, 9:
+        check([(False, {'max_retry': None})] * n + [(None, None)])
+        check([(False, {'max_retry': None})] * n + [(False, {'max_retry': 0})])
+      check([(False, {'max_retry': None})] * 9 + [(False, None)])
+    finally:
+      del activity_tool.__class__.doSomething
+    self.assertFalse(activity_tool.getMessageList())
 
   def test_70_TestConflictErrorsWhileValidatingWithSQLDict(self, quiet=0, run=run_all_test):
     """




More information about the Erp5-report mailing list