Index: third_party/typ/typ/tests/runner_test.py |
diff --git a/third_party/typ/typ/tests/runner_test.py b/third_party/typ/typ/tests/runner_test.py |
index 34098793c795d13c2aa0ef56ce8ccd2d776f5614..1d3b0cc5fd10ddff690076dfec02d59910fa9f23 100644 |
--- a/third_party/typ/typ/tests/runner_test.py |
+++ b/third_party/typ/typ/tests/runner_test.py |
@@ -12,10 +12,13 @@ |
# See the License for the specific language governing permissions and |
# limitations under the License. |
+import tempfile |
+ |
from textwrap import dedent as d |
from typ import Host, Runner, TestCase, TestSet, TestInput |
+from typ import WinMultiprocessing, main |
def _setup_process(child, context): # pylint: disable=W0613 |
@@ -36,12 +39,12 @@ class RunnerTests(TestCase): |
def test_bad_default(self): |
r = Runner() |
- ret = r.main(foo='bar') |
+ ret = r.main([], foo='bar') |
self.assertEqual(ret, 2) |
def test_good_default(self): |
r = Runner() |
- ret = r.main(tests=['typ.tests.runner_test.ContextTests']) |
+ ret = r.main([], tests=['typ.tests.runner_test.ContextTests']) |
self.assertEqual(ret, 0) |
@@ -80,6 +83,159 @@ class TestSetTests(TestCase): |
h.rmtree(tmpdir) |
+class TestWinMultiprocessing(TestCase): |
+ def make_host(self): |
+ return Host() |
+ |
+ def call(self, argv, platform=None, importable=None, **kwargs): |
+ h = self.make_host() |
+ orig_wd = h.getcwd() |
+ tmpdir = None |
+ try: |
+ tmpdir = h.mkdtemp() |
+ h.chdir(tmpdir) |
+ h.capture_output() |
+ if platform is not None: |
+ h.platform = platform |
+ r = Runner(h) |
+ if importable is not None: |
+ r._main_is_importable = lambda: importable |
+ ret = r.main(argv, **kwargs) |
+ finally: |
+ out, err = h.restore_output() |
+ h.chdir(orig_wd) |
+ if tmpdir: |
+ h.rmtree(tmpdir) |
+ |
+ return ret, out, err |
+ |
+ def test_bad_value(self): |
+ self.assertRaises(ValueError, self.call, [], win_multiprocessing='foo') |
+ |
+ def test_force(self): |
+ h = self.make_host() |
+ tmpdir = None |
+ orig_wd = h.getcwd() |
+ out = err = None |
+ out_str = err_str = '' |
+ try: |
+ tmpdir = h.mkdtemp() |
+ h.chdir(tmpdir) |
+ out = tempfile.NamedTemporaryFile(delete=False) |
+ err = tempfile.NamedTemporaryFile(delete=False) |
+ ret = main([], stdout=out, stderr=err, |
+ win_multiprocessing=WinMultiprocessing.force) |
+ finally: |
+ h.chdir(orig_wd) |
+ if tmpdir: |
+ h.rmtree(tmpdir) |
+ if out: |
+ out.close() |
+ out = open(out.name) |
+ out_str = out.read() |
+ out.close() |
+ h.remove(out.name) |
+ if err: |
+ err.close() |
+ err = open(err.name) |
+ err_str = err.read() |
+ err.close() |
+ h.remove(err.name) |
+ |
+ self.assertEqual(ret, 1) |
+ self.assertEqual(out_str, 'No tests to run.\n') |
+ self.assertEqual(err_str, '') |
+ |
+ def test_ignore(self): |
+ h = self.make_host() |
+ if h.platform == 'win32': # pragma: win32 |
+ self.assertRaises(ValueError, self.call, [], |
+ win_multiprocessing=WinMultiprocessing.ignore) |
+ else: |
+ result = self.call([], platform=None, importable=False, |
+ win_multiprocessing=WinMultiprocessing.ignore) |
+ ret, out, err = result |
+ self.assertEqual(ret, 1) |
+ self.assertEqual(out, 'No tests to run.\n') |
+ self.assertEqual(err, '') |
+ |
+ def test_multiple_jobs(self): |
+ self.assertRaises(ValueError, self.call, ['-j', '2'], |
+ platform='win32', importable=False) |
+ |
+ def test_normal(self): |
+ # This tests that typ itself is importable ... |
+ ret, out, err = self.call([]) |
+ self.assertEqual(ret, 1) |
+ self.assertEqual(out, 'No tests to run.\n') |
+ self.assertEqual(err, '') |
+ |
+ def test_real_unimportable_main(self): |
+ h = self.make_host() |
+ tmpdir = None |
+ orig_wd = h.getcwd() |
+ out = err = None |
+ out_str = err_str = '' |
+ try: |
+ tmpdir = h.mkdtemp() |
+ h.chdir(tmpdir) |
+ out = tempfile.NamedTemporaryFile(delete=False) |
+ err = tempfile.NamedTemporaryFile(delete=False) |
+ path_above_typ = h.realpath(h.dirname(__file__), '..', '..') |
+ env = {'PYTHONPATH': path_above_typ} |
+ h.write_text_file('test', d(""" |
+ import sys |
+ import typ |
+ sys.exit(typ.main()) |
+ """)) |
+ h.stdout = out |
+ h.stderr = err |
+ ret = h.call_inline([h.python_interpreter, h.join(tmpdir, 'test')], |
+ env=env) |
+ finally: |
+ h.chdir(orig_wd) |
+ if tmpdir: |
+ h.rmtree(tmpdir) |
+ if out: |
+ out.close() |
+ out = open(out.name) |
+ out_str = out.read() |
+ out.close() |
+ h.remove(out.name) |
+ if err: |
+ err.close() |
+ err = open(err.name) |
+ err_str = err.read() |
+ err.close() |
+ h.remove(err.name) |
+ |
+ self.assertEqual(ret, 1) |
+ self.assertEqual(out_str, '') |
+ self.assertIn('ValueError: The __main__ module is not importable', |
+ err_str) |
+ |
+ def test_run_serially(self): |
+ ret, out, err = self.call([], importable=False, |
+ win_multiprocessing=WinMultiprocessing.spawn) |
+ self.assertEqual(ret, 1) |
+ self.assertEqual(out, 'No tests to run.\n') |
+ self.assertEqual(err, '') |
+ |
+ def test_single_job(self): |
+ ret, out, err = self.call(['-j', '1'], platform='win32', |
+ importable=False) |
+ self.assertEqual(ret, 1) |
+ self.assertEqual(out, 'No tests to run.\n') |
+ self.assertEqual(err, '') |
+ |
+ def test_spawn(self): |
+ ret, out, err = self.call([], importable=False, |
+ win_multiprocessing=WinMultiprocessing.spawn) |
+ self.assertEqual(ret, 1) |
+ self.assertEqual(out, 'No tests to run.\n') |
+ self.assertEqual(err, '') |
+ |
+ |
class ContextTests(TestCase): |
def test_context(self): |
# This test is mostly intended to be called by |