|
@@ -1,12 +1,19 @@
|
|
|
+import pickle
|
|
|
import sys
|
|
|
import socket
|
|
|
import unittest2 as unittest
|
|
|
|
|
|
from celery import utils
|
|
|
+from celery.utils import promise, mpromise, maybe_promise
|
|
|
|
|
|
from celery.tests.utils import sleepdeprived, execute_context
|
|
|
from celery.tests.utils import mask_modules
|
|
|
|
|
|
+
|
|
|
+def double(x):
|
|
|
+ return x * 2
|
|
|
+
|
|
|
+
|
|
|
class test_chunks(unittest.TestCase):
|
|
|
|
|
|
def test_chunks(self):
|
|
@@ -79,6 +86,22 @@ class test_utils(unittest.TestCase):
|
|
|
def test_firstmethod_AttributeError(self):
|
|
|
self.assertIsNone(utils.firstmethod("foo")([object()]))
|
|
|
|
|
|
+ def test_firstmethod_promises(self):
|
|
|
+
|
|
|
+ class A(object):
|
|
|
+
|
|
|
+ def __init__(self, value=None):
|
|
|
+ self.value = value
|
|
|
+
|
|
|
+ def m(self):
|
|
|
+ return self.value
|
|
|
+
|
|
|
+ self.assertEqual("four", utils.firstmethod("m")([
|
|
|
+ A(), A(), A(), A("four"), A("five")]))
|
|
|
+ self.assertEqual("four", utils.firstmethod("m")([
|
|
|
+ A(), A(), A(), promise(lambda: A("four")), A("five")]))
|
|
|
+
|
|
|
+
|
|
|
def test_first(self):
|
|
|
iterations = [0]
|
|
|
|
|
@@ -140,3 +163,55 @@ class test_retry_over_time(unittest.TestCase):
|
|
|
|
|
|
self.assertRaises(socket.error, utils.retry_over_time,
|
|
|
_fun, (socket.error, ), args=[32, 32], max_retries=1)
|
|
|
+
|
|
|
+
|
|
|
+class test_promise(unittest.TestCase):
|
|
|
+
|
|
|
+ def test__str__(self):
|
|
|
+ self.assertEqual(str(promise(lambda: "the quick brown fox")),
|
|
|
+ "the quick brown fox")
|
|
|
+
|
|
|
+ def test__repr__(self):
|
|
|
+ self.assertEqual(repr(promise(lambda: "fi fa fo")),
|
|
|
+ "'fi fa fo'")
|
|
|
+
|
|
|
+ def test_evaluate(self):
|
|
|
+ self.assertEqual(promise(lambda: 2 + 2)(), 4)
|
|
|
+ self.assertEqual(promise(lambda x: x * 4, 2), 8)
|
|
|
+ self.assertEqual(promise(lambda x: x * 8, 2)(), 16)
|
|
|
+
|
|
|
+ def test_cmp(self):
|
|
|
+ self.assertEqual(promise(lambda: 10), promise(lambda: 10))
|
|
|
+ self.assertNotEqual(promise(lambda: 10), promise(lambda: 20))
|
|
|
+
|
|
|
+ def test__reduce__(self):
|
|
|
+ x = promise(double, 4)
|
|
|
+ y = pickle.loads(pickle.dumps(x))
|
|
|
+ self.assertEqual(x(), y())
|
|
|
+
|
|
|
+ def test__deepcopy__(self):
|
|
|
+ from copy import deepcopy
|
|
|
+ x = promise(double, 4)
|
|
|
+ y = deepcopy(x)
|
|
|
+ self.assertEqual(x._fun, y._fun)
|
|
|
+ self.assertEqual(x._args, y._args)
|
|
|
+ self.assertEqual(x(), y())
|
|
|
+
|
|
|
+
|
|
|
+class test_mpromise(unittest.TestCase):
|
|
|
+
|
|
|
+ def test_is_memoized(self):
|
|
|
+
|
|
|
+ it = iter(xrange(20, 30))
|
|
|
+ p = mpromise(it.next)
|
|
|
+ self.assertEqual(p(), 20)
|
|
|
+ self.assertTrue(p.evaluated)
|
|
|
+ self.assertEqual(p(), 20)
|
|
|
+ self.assertEqual(repr(p), "20")
|
|
|
+
|
|
|
+
|
|
|
+class test_maybe_promise(unittest.TestCase):
|
|
|
+
|
|
|
+ def test_evaluates(self):
|
|
|
+ self.assertEqual(maybe_promise(promise(lambda: 10)), 10)
|
|
|
+ self.assertEqual(maybe_promise(20), 20)
|