[CalendarServer-changes] [10249] CalendarServer/branches/users/glyph/queue-locking-and-timing

source_changes at macosforge.org source_changes at macosforge.org
Fri Jan 4 16:39:07 PST 2013


Revision: 10249
          http://trac.calendarserver.org//changeset/10249
Author:   glyph at apple.com
Date:     2013-01-04 16:39:07 -0800 (Fri, 04 Jan 2013)
Log Message:
-----------
Some tests for the new preCommit API.

Modified Paths:
--------------
    CalendarServer/branches/users/glyph/queue-locking-and-timing/twext/enterprise/test/test_adbapi2.py

Property Changed:
----------------
    CalendarServer/branches/users/glyph/queue-locking-and-timing/

Modified: CalendarServer/branches/users/glyph/queue-locking-and-timing/twext/enterprise/test/test_adbapi2.py
===================================================================
--- CalendarServer/branches/users/glyph/queue-locking-and-timing/twext/enterprise/test/test_adbapi2.py	2013-01-05 00:39:06 UTC (rev 10248)
+++ CalendarServer/branches/users/glyph/queue-locking-and-timing/twext/enterprise/test/test_adbapi2.py	2013-01-05 00:39:07 UTC (rev 10249)
@@ -30,6 +30,7 @@
 from twisted.trial.unittest import TestCase
 
 from twisted.internet.task import Clock
+from twisted.internet.defer import Deferred
 
 from twisted.internet.interfaces import IReactorThreads
 
@@ -369,11 +370,11 @@
 
 
     @property
-    def _q(self):
+    def _get_q(self):
         return self._q_
 
 
-    @_q.setter
+    @_get_q.setter
     def _q(self, newq):
         if newq is not None:
             oget = newq.get
@@ -1080,6 +1081,52 @@
         return t
 
 
+    def test_preCommitSuccess(self):
+        """
+        Callables passed to L{IAsyncTransaction.preCommit} will be invoked upon
+        commit.
+        """
+        txn = self.createTransaction()
+        def simple():
+            simple.done = True
+        simple.done = False
+        txn.preCommit(simple)
+        self.assertEquals(simple.done, False)
+        result = self.resultOf(txn.commit())
+        self.assertEquals(len(result), 1)
+        self.assertEquals(simple.done, True)
+
+
+    def test_deferPreCommit(self):
+        """
+        If callables passed to L{IAsyncTransaction.preCommit} return
+        L{Deferred}s, they will defer the actual commit operation until it has
+        fired.
+        """
+        txn = self.createTransaction()
+        d = Deferred()
+        def wait():
+            wait.started = True
+            def executed(it):
+                wait.sqlResult = it
+            # To make sure the _underlying_ commit operation was Deferred, we
+            # have to execute some SQL to make sure it happens.
+            return (d.addCallback(lambda ignored: txn.execSQL("some test sql"))
+                     .addCallback(executed))
+        wait.started = False
+        wait.sqlResult = None
+        txn.preCommit(wait)
+        result = self.resultOf(txn.commit())
+        self.flushHolders()
+        self.assertEquals(wait.started, True)
+        self.assertEquals(wait.sqlResult, None)
+        self.assertEquals(result, [])
+        d.callback(None)
+        self.flushHolders()
+        self.assertEquals(len(result), 1)
+        self.assertEquals(wait.sqlResult, [[1, "some test sql"]])
+
+
     def test_noOpCommitDoesntHinderReconnection(self):
         """
         Until you've executed a query or performed a statement on an ADBAPI
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130104/17f70c74/attachment-0001.html>


More information about the calendarserver-changes mailing list