def test_badly_decorated_pass(): concurrency = 1 results = call_concurrently(concurrency, 'tests.funcs_to_test:wallpaper', colour='orange') pprint([str(r) for r in results]) for result in results: assert result == 'orange stripes'
def test_timeout(): results = call_concurrently(1, timeout, sleep_for=SUBPROCESS_TIMEOUT + 5) pprint([str(r) for r in results]) for result in results: assert isinstance(result, WrappedError) assert isinstance(result.error, TerminatedProcessError)
def test_badly_decorated_fail(): concurrency = 1 results = call_concurrently(concurrency, wallpaper, colour='orange') pprint([str(r) for r in results]) for result in results: assert isinstance(result, AttributeError)
def test_badly_decorated_fail(): concurrency = 1 results = call_concurrently(concurrency, wallpaper, colour='orange') pprint([str(r) for r in results]) for result in results: assert isinstance(result, WrappedError) assert isinstance(result.error, AttributeError)
def test_exception(): concurrency = 5 results = call_concurrently(concurrency, raise_exception) pprint([str(r) for r in results]) for result in results: assert isinstance(result, CustomError) assert result.args == ('WTF',)
def test_environment(): assert os.getenv('WTF') is None with override_environment(WTF='dude'): results = call_concurrently(1, environment) pprint([str(r) for r in results]) assert os.getenv('WTF') is None assert results[0] == 'dude'
def test_invoice_number_monthly_duplicity(self): """ Test for problem where two simultaneously created invoices had duplicate number """ call_concurrently(15, complete_order) invoices = Invoice.objects.filter( type=Invoice.INVOICE_TYPES.INVOICE).order_by("issued", "number") first_december_number = 0 for i in range(1, 15): invoice = invoices[i - 1] if invoice.issued.month == 2 and first_december_number == 0: first_december_number = i - 1 invoice_number = i - first_december_number self.assertEqual(invoice.number, invoice_number) self.assertEqual( invoice.full_number, f"{invoice_number}/FV/0{1 if first_december_number == 0 else 2}/2012" )
def test_exception(): """ Exceptions raised by the func being called concurrently are wrapped with WrappedError, providing access to the original error and traceback. """ concurrency = 5 results = call_concurrently(concurrency, raise_exception) pprint([str(r) for r in results]) for result in results: assert isinstance(result, WrappedError) assert isinstance(result.traceback, types.TracebackType) assert isinstance(result.error, CustomError) assert result.error.args == ('WTF', )
def test_naive(): # call_concurrently should reveal the race condition here obj = Semaphore.objects.create() concurrency = 5 results = call_concurrently(concurrency, update_count_naive, id_=obj.pk) pprint([str(r) for r in results]) successes = list(filter(is_success, results)) obj = Semaphore.objects.get(pk=obj.pk) # at least one succeeded assert len(successes) > 0 # later successes overwrote each other assert len(successes) > obj.count
def test_transactional(): # there should be no race condition here obj = Semaphore.objects.create() concurrency = 5 results = call_concurrently(concurrency, update_count_transactional, id_=obj.pk) pprint([str(r) for r in results]) successes = list(filter(is_success, results)) obj = Semaphore.objects.get(pk=obj.pk) # at least one succeeded assert len(successes) > 0 # all successes correctly incremented assert len(successes) == obj.count
def test_simple(): concurrency = 2 results = call_concurrently(concurrency, simple) assert results == [True, True]
def test_timeout(): results = call_concurrently(1, timeout, sleep_for=SUBPROCESS_TIMEOUT + 5) pprint([str(r) for r in results]) for result in results: assert isinstance(result, TerminatedProcessError)