[Zope-Checkins] SVN: Zope/trunk/src/Products/Transience/tests/ Cleaned up and speed up Transience tests a bit. Now they take 20 seconds out of 50 seconds total for Zope2 - before it was 30 out of 60. There should still be some more room for improvement.
Hanno Schlichting
hannosch at hannosch.eu
Fri Apr 30 19:53:33 EDT 2010
Log message for revision 111814:
Cleaned up and speed up Transience tests a bit. Now they take 20 seconds out of 50 seconds total for Zope2 - before it was 30 out of 60. There should still be some more room for improvement.
Changed:
U Zope/trunk/src/Products/Transience/tests/fauxtime.py
A Zope/trunk/src/Products/Transience/tests/slowfauxtime.py
U Zope/trunk/src/Products/Transience/tests/testTimeoutRelated.py
U Zope/trunk/src/Products/Transience/tests/testTransactionHelper.py
U Zope/trunk/src/Products/Transience/tests/testTransientObject.py
U Zope/trunk/src/Products/Transience/tests/testTransientObjectContainer.py
-=-
Modified: Zope/trunk/src/Products/Transience/tests/fauxtime.py
===================================================================
--- Zope/trunk/src/Products/Transience/tests/fauxtime.py 2010-04-30 23:00:54 UTC (rev 111813)
+++ Zope/trunk/src/Products/Transience/tests/fauxtime.py 2010-04-30 23:53:33 UTC (rev 111814)
@@ -1,3 +1,4 @@
+import sys
import time as origtime
epoch = origtime.time()
@@ -2,8 +3,16 @@
+resolution = 120.0
+timeout = 30
+
+if sys.platform[:3].lower() == "win":
+ resolution = 60.0
+ timeout = 60
+
+
def time():
- """ False timer -- returns time 60 x faster than normal time """
- return (origtime.time() - epoch) * 60.0
+ """ False timer -- returns time R x faster than normal time """
+ return (origtime.time() - epoch) * resolution
def sleep(duration):
- """ False sleep -- sleep for 1/60 the time specifed """
- origtime.sleep(duration / 60.0)
+ """ False sleep -- sleep for 1/R the time specifed """
+ origtime.sleep(duration / resolution)
Added: Zope/trunk/src/Products/Transience/tests/slowfauxtime.py
===================================================================
--- Zope/trunk/src/Products/Transience/tests/slowfauxtime.py (rev 0)
+++ Zope/trunk/src/Products/Transience/tests/slowfauxtime.py 2010-04-30 23:53:33 UTC (rev 111814)
@@ -0,0 +1,12 @@
+import time as origtime
+
+epoch = origtime.time()
+
+
+def time():
+ """ False timer -- returns time 60 x faster than normal time """
+ return (origtime.time() - epoch) * 60
+
+def sleep(duration):
+ """ False sleep -- sleep for 1/60 the time specifed """
+ origtime.sleep(duration / 60)
Property changes on: Zope/trunk/src/Products/Transience/tests/slowfauxtime.py
___________________________________________________________________
Added: svn:eol-style
+ native
Modified: Zope/trunk/src/Products/Transience/tests/testTimeoutRelated.py
===================================================================
--- Zope/trunk/src/Products/Transience/tests/testTimeoutRelated.py 2010-04-30 23:00:54 UTC (rev 111813)
+++ Zope/trunk/src/Products/Transience/tests/testTimeoutRelated.py 2010-04-30 23:53:33 UTC (rev 111814)
@@ -1,24 +1,12 @@
-import sys, os, time, unittest
-
-if __name__=='__main__':
- sys.path.insert(0, '..')
- sys.path.insert(0, '../../..')
-
import ZODB # in order to get Persistence.Persistent working
import transaction
from Testing import makerequest
-import Acquisition
-from Acquisition import aq_base
from Products.Transience.Transience import TransientObjectContainer
import Products.Transience.Transience
import Products.Transience.TransientObject
-from Products.PythonScripts.PythonScript import PythonScript
-from ZODB.POSException import InvalidObjectReference
-from DateTime import DateTime
-from unittest import TestCase, TestSuite, TextTestRunner, makeSuite
+from unittest import TestCase, TestSuite, makeSuite
from ZODB.DemoStorage import DemoStorage
from OFS.Application import Application
-import threading
import fauxtime
import time as oldtime
@@ -26,7 +14,6 @@
stuff = {}
def _getApp():
-
app = stuff.get('app', None)
if not app:
ds = DemoStorage()
@@ -109,10 +96,9 @@
def testDelNotification(self):
self.app.sm.setDelNotificationTarget(delNotificationTarget)
sdo = self.app.sm.new_or_existing('TempObject')
- timeout = self.timeout * 60
- # sleep 2X longer than timeout? doesnt work at 1.1X, 1.5X?
- fauxtime.sleep(timeout * 2)
- sdo1 = self.app.sm.get('TempObject')
+ # sleep longer than timeout
+ fauxtime.sleep(self.timeout * 100.0)
+ self.app.sm.get('TempObject')
now = fauxtime.time()
k = sdo.get('endtime')
self.assertEqual(type(k), type(now))
@@ -122,18 +108,17 @@
# in response to http://zope.org/Collectors/Zope/1403
self.assertEqual(None, self.app.sm._getCallback('/foo/bar/baz'))
+
def addNotificationTarget(item, context):
item['starttime'] = fauxtime.time()
+
def delNotificationTarget(item, context):
item['endtime'] = fauxtime.time()
+
def test_suite():
last_accessed = makeSuite(TestLastAccessed, 'test')
start_end = makeSuite(TestNotifications, 'test')
suite = TestSuite((start_end, last_accessed))
return suite
-
-if __name__ == '__main__':
- runner = TextTestRunner(verbosity=9)
- runner.run(test_suite())
Modified: Zope/trunk/src/Products/Transience/tests/testTransactionHelper.py
===================================================================
--- Zope/trunk/src/Products/Transience/tests/testTransactionHelper.py 2010-04-30 23:00:54 UTC (rev 111813)
+++ Zope/trunk/src/Products/Transience/tests/testTransactionHelper.py 2010-04-30 23:53:33 UTC (rev 111814)
@@ -10,17 +10,13 @@
# FOR A PARTICULAR PURPOSE
#
##############################################################################
-import sys, os, time, random, unittest
-if __name__ == "__main__":
- sys.path.insert(0, '../../..')
-
-import ZODB
import transaction
-from unittest import TestCase, TestSuite, TextTestRunner, makeSuite
+from unittest import TestCase, makeSuite
from Products.Transience.TransactionHelper import PreventTransactionCommit, \
makeTransactionUncommittable
+
class TestTransactionHelper(TestCase):
def setUp(self):
self.t = transaction.get()
@@ -32,11 +28,8 @@
makeTransactionUncommittable(self.t, "test")
self.assertRaises(PreventTransactionCommit, transaction.commit)
transaction.abort()
-
+
+
def test_suite():
suite = makeSuite(TestTransactionHelper, 'test')
return suite
-
-if __name__ == '__main__':
- runner = TextTestRunner(verbosity=9)
- runner.run(test_suite())
Modified: Zope/trunk/src/Products/Transience/tests/testTransientObject.py
===================================================================
--- Zope/trunk/src/Products/Transience/tests/testTransientObject.py 2010-04-30 23:00:54 UTC (rev 111813)
+++ Zope/trunk/src/Products/Transience/tests/testTransientObject.py 2010-04-30 23:53:33 UTC (rev 111814)
@@ -10,14 +10,11 @@
# FOR A PARTICULAR PURPOSE
#
##############################################################################
-import sys, os, unittest
-import ZODB
from Products.Transience.Transience import TransientObjectContainer
-from Products.Transience.TransientObject import TransientObject
import Products.Transience.TransientObject
import Products.Transience.Transience
-from unittest import TestCase, TestSuite, TextTestRunner, makeSuite
+from unittest import TestCase, TestSuite, makeSuite
import time as oldtime
import fauxtime
@@ -27,7 +24,7 @@
Products.Transience.TransientObject.time = fauxtime
Products.Transience.Transience.setStrict(1)
self.errmargin = .20
- self.timeout = 60
+ self.timeout = fauxtime.timeout
self.t = TransientObjectContainer('sdc', timeout_mins=self.timeout/60)
def tearDown(self):
@@ -69,7 +66,6 @@
def testSetLastModified(self):
t = self.t.new('xyzzy')
- ft = fauxtime.time()
t.setLastModified()
self.failIfEqual(t.getLastModified(), None)
@@ -137,7 +133,3 @@
'epoch': 999999999,
'fauxtime': fauxtime
}
-
-if __name__ == '__main__':
- runner = TextTestRunner(verbosity=9)
- runner.run(test_suite())
Modified: Zope/trunk/src/Products/Transience/tests/testTransientObjectContainer.py
===================================================================
--- Zope/trunk/src/Products/Transience/tests/testTransientObjectContainer.py 2010-04-30 23:00:54 UTC (rev 111813)
+++ Zope/trunk/src/Products/Transience/tests/testTransientObjectContainer.py 2010-04-30 23:53:33 UTC (rev 111814)
@@ -10,30 +10,28 @@
# FOR A PARTICULAR PURPOSE
#
##############################################################################
-import sys, os, time, random, unittest
+import random
-if __name__ == "__main__":
- sys.path.insert(0, '../../..')
-
-import ZODB
from Products.Transience.Transience import TransientObjectContainer,\
- MaxTransientObjectsExceeded, SPARE_BUCKETS, getCurrentTimeslice
+ MaxTransientObjectsExceeded, SPARE_BUCKETS
from Products.Transience.TransientObject import TransientObject
import Products.Transience.Transience
import Products.Transience.TransientObject
-from ExtensionClass import Base
-from unittest import TestCase, TestSuite, TextTestRunner, makeSuite
+from unittest import TestCase, TestSuite, makeSuite
import time as oldtime
import fauxtime
+import slowfauxtime
-class TestBase(TestCase):
+
+class TestTransientObjectContainer(TestCase):
+
def setUp(self):
Products.Transience.Transience.time = fauxtime
Products.Transience.TransientObject.time = fauxtime
Products.Transience.Transience.setStrict(1)
-
+
self.errmargin = .20
- self.timeout = 120
+ self.timeout = fauxtime.timeout
self.period = 20
self.t = TransientObjectContainer('sdc', timeout_mins=self.timeout/60,
period_secs=self.period)
@@ -44,7 +42,6 @@
Products.Transience.TransientObject.time = oldtime
Products.Transience.Transience.setStrict(0)
-class TestTransientObjectContainer(TestBase):
def testGetItemFails(self):
self.assertRaises(KeyError, self._getitemfail)
@@ -239,59 +236,6 @@
except KeyError:
self.failIf(self.t.has_key(x))
- def testItemsGetExpired(self):
- for x in range(10, 110):
- self.t[x] = x
- # these items will time out while we sleep
- fauxtime.sleep(self.timeout * (self.errmargin+1))
- for x in range(110, 210):
- self.t[x] = x
- self.assertEqual(len(self.t.keys()), 100)
-
- # call _gc just to make sure __len__ gets changed after a gc
- #self.t._gc()
- self.assertEqual(len(self.t), 100)
-
- # we should still have 100 - 199
- for x in range(110, 210):
- self.assertEqual(self.t[x], x)
- # but we shouldn't have 0 - 100
- for x in range(10, 110):
- try: self.t[x]
- except KeyError: pass
- else: assert 1 == 2, x
-
- def testChangingTimeoutWorks(self):
- # 1 minute
- for x in range(10, 110):
- self.t[x] = x
- fauxtime.sleep(self.timeout * (self.errmargin+1))
- self.assertEqual(len(self.t.keys()), 0)
-
- # 2 minutes
- self.t._setTimeout(self.timeout/60*2, self.period)
- self.t._reset()
- for x in range(10, 110):
- self.t[x] = x
- fauxtime.sleep(self.timeout)
-
-
- self.assertEqual(len(self.t.keys()), 100)
- fauxtime.sleep(self.timeout * (self.errmargin+1))
- self.assertEqual(len(self.t.keys()), 0)
-
- # 3 minutes
- self.t._setTimeout(self.timeout/60*3, self.period)
- self.t._reset()
- for x in range(10, 110):
- self.t[x] = x
- fauxtime.sleep(self.timeout)
- self.assertEqual(len(self.t.keys()), 100)
- fauxtime.sleep(self.timeout)
- self.assertEqual(len(self.t.keys()), 100)
- fauxtime.sleep(self.timeout * (self.errmargin+1))
- self.assertEqual(len(self.t.keys()), 0)
-
def testGetDelaysTimeout(self):
for x in range(10, 110):
self.t[x] = x
@@ -352,10 +296,10 @@
self.failUnless(issubclass(t.__class__, TransientObject))
def _dupNewItem(self):
- t = self.t.new('foobieblech')
+ self.t.new('foobieblech')
def test_newDupFails(self):
- t = self.t.new('foobieblech')
+ self.t.new('foobieblech')
self.assertRaises(KeyError, self._dupNewItem)
def test_new_or_existing(self):
@@ -397,6 +341,79 @@
self.t.new(str(x))
+class TestSlowTransientObjectContainer(TestCase):
+
+ def setUp(self):
+ Products.Transience.Transience.time = slowfauxtime
+ Products.Transience.TransientObject.time = slowfauxtime
+ Products.Transience.Transience.setStrict(1)
+
+ self.errmargin = .20
+ self.timeout = 120
+ self.period = 20
+ self.t = TransientObjectContainer('sdc', timeout_mins=self.timeout/60,
+ period_secs=self.period)
+
+ def tearDown(self):
+ self.t = None
+ Products.Transience.Transience.time = oldtime
+ Products.Transience.TransientObject.time = oldtime
+ Products.Transience.Transience.setStrict(0)
+
+ def testChangingTimeoutWorks(self):
+ # TODO: This test is slooooow
+ # 1 minute
+ for x in range(10, 110):
+ self.t[x] = x
+ slowfauxtime.sleep(self.timeout * (self.errmargin + 1))
+ self.assertEqual(len(self.t.keys()), 0)
+
+ # 2 minutes
+ self.t._setTimeout(self.timeout/60*2, self.period)
+ self.t._reset()
+ for x in range(10, 110):
+ self.t[x] = x
+ slowfauxtime.sleep(self.timeout)
+
+ self.assertEqual(len(self.t.keys()), 100)
+ slowfauxtime.sleep(self.timeout * (self.errmargin+1))
+ self.assertEqual(len(self.t.keys()), 0)
+
+ # 3 minutes
+ self.t._setTimeout(self.timeout/60*3, self.period)
+ self.t._reset()
+ for x in range(10, 110):
+ self.t[x] = x
+ slowfauxtime.sleep(self.timeout)
+ self.assertEqual(len(self.t.keys()), 100)
+ slowfauxtime.sleep(self.timeout)
+ self.assertEqual(len(self.t.keys()), 100)
+ slowfauxtime.sleep(self.timeout * (self.errmargin+1))
+ self.assertEqual(len(self.t.keys()), 0)
+
+ def testItemsGetExpired(self):
+ for x in range(10, 110):
+ self.t[x] = x
+ # these items will time out while we sleep
+ slowfauxtime.sleep(self.timeout * (self.errmargin+1))
+ for x in range(110, 210):
+ self.t[x] = x
+ self.assertEqual(len(self.t.keys()), 100)
+
+ # call _gc just to make sure __len__ gets changed after a gc
+ #self.t._gc()
+ self.assertEqual(len(self.t), 100)
+
+ # we should still have 100 - 199
+ for x in range(110, 210):
+ self.assertEqual(self.t[x], x)
+ # but we shouldn't have 0 - 100
+ for x in range(10, 110):
+ try: self.t[x]
+ except KeyError: pass
+ else: assert 1 == 2, x
+
+
def lsubtract(l1, l2):
l1=list(l1)
l2=list(l2)
@@ -404,11 +421,9 @@
l = l + filter(lambda x, l2=l2: x not in l2, l1)
return l
+
def test_suite():
- testsuite = makeSuite(TestTransientObjectContainer, 'test')
- alltests = TestSuite((testsuite,))
- return alltests
-
-if __name__ == '__main__':
- runner = TextTestRunner(verbosity=9)
- runner.run(test_suite())
+ suite = TestSuite()
+ suite.addTest(makeSuite(TestTransientObjectContainer))
+ suite.addTest(makeSuite(TestSlowTransientObjectContainer))
+ return suite
More information about the Zope-Checkins
mailing list