1. brianfrantz
  2. beaker


Philip Jenvey  committed 841eb3a

make test_syndict succeed on Jython by explicitly garbage collecting when
CPython's was assumed to have happened

  • Participants
  • Parent commits 157ac68
  • Branches trunk

Comments (0)

Files changed (1)

File tests/test_syncdict.py

View file
  • Ignore whitespace
 from beaker.util import SyncDict
-import random, time, weakref, sys
+import gc, random, sys, time, weakref
 # this script tests SyncDict for its thread safety, 
 # ability to always return a value even for a dictionary 
     raise "this test requires a thread-enabled python"
+jython = sys.platform.startswith('java')
+def collect():
+    """The tests assume CPython GC behavior in regard to weakrefs, but
+    we can coerce Jython into passing by triggering GC when we expect
+    it to have happened on CPython
+    """
+    if jython:
+        gc.collect()
 class item:
     baton = True
         global theitem
+        collect()
         if theitem() is not None:
             raise "create %d old item is still referenced" % id
             del s['test']
         except KeyError: 
-        time.sleep(random.random() * .89)
+        # Give Jython more time on the final create for Java GC
+        sleeptime = (jython and x == 9) and 2 or random.random() * .89
+        time.sleep(sleeptime)
     failed = not running
 # normal dictionary test, where we will remove the value
 # periodically. the number of creates should be equal to
 # the number of removes plus one.    
 print "\ntesting with normal dict"
 runtest(SyncDict(thread.allocate_lock(), {}))
 assert(totalremoves + 1 == totalcreates)
 print "\ntesting with weak dict"
 runtest(SyncDict(thread.allocate_lock(), weakref.WeakValueDictionary()))