test_runner: Monkey-patch to allow using multiprocessing in tests.

Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
This commit is contained in:
Anders Kaseorg
2019-07-27 20:38:02 -07:00
committed by Tim Abbott
parent f751acbec5
commit 73eb0aa891

View File

@@ -1,9 +1,10 @@
import multiprocessing
import os import os
import random import random
import shutil import shutil
from functools import partial from functools import partial
from multiprocessing.sharedctypes import Synchronized from multiprocessing.sharedctypes import Synchronized
from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Type, Union from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Type, Union, cast
from unittest import TestLoader, TestSuite, runner from unittest import TestLoader, TestSuite, runner
from unittest.result import TestResult from unittest.result import TestResult
@@ -122,6 +123,15 @@ def run_subsuite(args: SubsuiteArgs) -> Tuple[int, Any]:
process_instrumented_calls(partial(result.addInstrumentation, None)) process_instrumented_calls(partial(result.addInstrumentation, None))
return subsuite_index, result.events return subsuite_index, result.events
# Monkey-patch django.test.runner to allow using multiprocessing
# inside tests without a “daemonic processes are not allowed to have
# children” error.
class NoDaemonContext(multiprocessing.context.ForkContext):
class Process(multiprocessing.context.ForkProcess):
daemon = cast(bool, property(lambda self: False, lambda self, value: None))
django_runner.multiprocessing = NoDaemonContext()
def destroy_test_databases(worker_id: Optional[int]=None) -> None: def destroy_test_databases(worker_id: Optional[int]=None) -> None:
for alias in connections: for alias in connections:
connection = connections[alias] connection = connections[alias]