Skip to content

Commit 3b330d9

Browse files
author
Omer Katz
committed
Added a test to verify that second order replace works as expected. Fixes celery#3116.
1 parent d02d260 commit 3b330d9

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

t/integration/tasks.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from time import sleep
55

6-
from celery import group, shared_task
6+
from celery import chain, group, shared_task
77
from celery.utils.log import get_task_logger
88

99
logger = get_task_logger(__name__)
@@ -74,3 +74,31 @@ def redis_echo(message):
7474

7575
redis_connection = StrictRedis()
7676
redis_connection.rpush('redis-echo', message)
77+
78+
79+
@shared_task(bind=True)
80+
def second_order_replace1(self, state=False):
81+
from redis import StrictRedis
82+
83+
redis_connection = StrictRedis()
84+
if not state:
85+
redis_connection.rpush('redis-echo', 'In A')
86+
new_task = chain(second_order_replace2.s(),
87+
second_order_replace1.si(state=True))
88+
raise self.replace(new_task)
89+
else:
90+
redis_connection.rpush('redis-echo', 'Out A')
91+
92+
93+
@shared_task(bind=True)
94+
def second_order_replace2(self, state=False):
95+
from redis import StrictRedis
96+
97+
redis_connection = StrictRedis()
98+
if not state:
99+
redis_connection.rpush('redis-echo', 'In B')
100+
new_task = chain(redis_echo.s("In/Out C"),
101+
second_order_replace2.si(state=True))
102+
raise self.replace(new_task)
103+
else:
104+
redis_connection.rpush('redis-echo', 'Out B')

t/integration/test_canvas.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
from celery.result import AsyncResult, GroupResult
99

1010
from .conftest import flaky
11-
from .tasks import add, add_replaced, add_to_all, collect_ids, ids, redis_echo
11+
from .tasks import (add, add_replaced, add_to_all, collect_ids, ids,
12+
redis_echo, second_order_replace1)
1213

1314
TIMEOUT = 120
1415

@@ -58,6 +59,26 @@ def test_group_chord_group_chain(self, manager):
5859
assert set(redis_messages[4:]) == after_items
5960
redis_connection.delete('redis-echo')
6061

62+
@flaky
63+
def test_second_order_replace(self, manager):
64+
from celery.five import bytes_if_py2
65+
66+
if not manager.app.conf.result_backend.startswith('redis'):
67+
raise pytest.skip('Requires redis result backend.')
68+
69+
redis_connection = StrictRedis()
70+
redis_connection.delete('redis-echo')
71+
72+
result = second_order_replace1.delay()
73+
result.get(timeout=TIMEOUT)
74+
redis_messages = list(map(
75+
bytes_if_py2,
76+
redis_connection.lrange('redis-echo', 0, -1)
77+
))
78+
79+
expected_messages = [b'In A', b'In B', b'In/Out C', b'Out B', b'Out A']
80+
assert redis_messages == expected_messages
81+
6182
@flaky
6283
def test_parent_ids(self, manager, num=10):
6384
assert manager.inspect().ping()

0 commit comments

Comments
 (0)