summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2019-06-03 18:35:55 +0200
committerRyan Dahl <ry@tinyclouds.org>2019-06-03 12:35:55 -0400
commit43c6c1a9f58a8d423a2d55092609e620f9765bcf (patch)
treef0bc5783b40bbde27dc52ff01552e21258e59324
parentbbc8de0c7a6a086ea7b0b79c6f5b005f9f374a7d (diff)
Refactor test infrastructure (#2432)
* use subclass of unittest.TestCase for all test cases * allow to run single test file (eg. python tools/integration_tests.py) * test filtering (via --pattern/-p CLI flag) * use common CLI parser for all tests: usage: test.py [-h] [--failfast] [--verbose] [--executable EXECUTABLE] [--release] [--pattern PATTERN] [--build-dir BUILD_DIR] optional arguments: -h, --help show this help message and exit --failfast, -f Stop on first failure --verbose, -v Verbose output --executable EXECUTABLE Use external executable of Deno --release Test against release executable --pattern PATTERN, -p PATTERN Run tests that match provided pattern --build-dir BUILD_DIR Deno build directory * respect NO_COLOR variable
-rw-r--r--.appveyor.yml2
-rwxr-xr-xtools/benchmark_test.py4
-rwxr-xr-xtools/complex_permissions_test.py24
-rwxr-xr-xtools/deno_dir_test.py7
-rwxr-xr-xtools/fetch_test.py10
-rwxr-xr-xtools/fmt_test.py7
-rwxr-xr-xtools/integration_tests.py43
-rwxr-xr-xtools/is_tty_test.py6
-rwxr-xr-xtools/permission_prompt_test.py8
-rw-r--r--tools/repl_test.py12
-rw-r--r--tools/setup_test.py4
-rw-r--r--tools/target_test.py60
-rwxr-xr-xtools/test.py119
-rw-r--r--tools/test_util.py140
-rwxr-xr-xtools/unit_tests.py8
-rw-r--r--tools/util.py94
-rwxr-xr-xtools/util_test.py15
17 files changed, 284 insertions, 279 deletions
diff --git a/.appveyor.yml b/.appveyor.yml
index dd86bfc69..a166aa71e 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -196,7 +196,7 @@ build_script:
test_script:
- python tools\lint.py
- python tools\test_format.py
- - ps: Exec { & python tools\test.py -v $env:DENO_BUILD_PATH }
+ - ps: Exec { & python tools\test.py -v --build-dir $env:DENO_BUILD_PATH }
after_test:
# Delete the the rollup cache, which is unreliable, so that it doesn't get
diff --git a/tools/benchmark_test.py b/tools/benchmark_test.py
index 92eb6d5ee..a49db7b74 100755
--- a/tools/benchmark_test.py
+++ b/tools/benchmark_test.py
@@ -4,7 +4,7 @@ import sys
import os
import benchmark
import unittest
-from util import DenoTestCase, test_main
+from test_util import DenoTestCase, run_tests
class TestBenchmark(DenoTestCase):
@@ -56,4 +56,4 @@ class TestBenchmark(DenoTestCase):
if __name__ == '__main__':
# FIME this doesn't appear to be the case.
# This test assumes tools/http_server.py is running in the background.
- test_main()
+ run_tests()
diff --git a/tools/complex_permissions_test.py b/tools/complex_permissions_test.py
index 40ba61819..00cda6069 100755
--- a/tools/complex_permissions_test.py
+++ b/tools/complex_permissions_test.py
@@ -2,13 +2,11 @@
# -*- coding: utf-8 -*-
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import os
-import subprocess
-import sys
-import time
import unittest
-from http_server import spawn
-from util import DenoTestCase, root_path, test_main, tty_capture
+import http_server
+from test_util import DenoTestCase, run_tests
+from util import root_path, tty_capture
PERMISSIONS_PROMPT_TEST_TS = "tools/complex_permissions_test.ts"
@@ -25,8 +23,8 @@ class BaseComplexPermissionTest(DenoTestCase):
return tty_capture(cmd, b'')
-class TestReadPermissions(BaseComplexPermissionTest):
- test_type = "read"
+class BaseReadWritePermissionsTest(object):
+ test_type = None
def test_inside_project_dir(self):
code, _stdout, stderr = self._run_deno(
@@ -97,7 +95,13 @@ class TestReadPermissions(BaseComplexPermissionTest):
os.chdir(saved_curdir)
-class TestWritePermissions(TestReadPermissions):
+class TestReadPermissions(BaseReadWritePermissionsTest,
+ BaseComplexPermissionTest):
+ test_type = "read"
+
+
+class TestWritePermissions(BaseReadWritePermissionsTest,
+ BaseComplexPermissionTest):
test_type = "write"
@@ -211,5 +215,5 @@ def complex_permissions_tests():
if __name__ == "__main__":
- with spawn():
- test_main()
+ with http_server.spawn():
+ run_tests()
diff --git a/tools/deno_dir_test.py b/tools/deno_dir_test.py
index 7133d02d7..052516d0e 100755
--- a/tools/deno_dir_test.py
+++ b/tools/deno_dir_test.py
@@ -3,10 +3,9 @@
# Check deno dir is created properly
# Usage: deno_dir_test.py [path to deno dir]
import os
-import subprocess
-import sys
-from util import DenoTestCase, mkdtemp, rmtree, run, test_main
+from test_util import DenoTestCase, run_tests
+from util import mkdtemp, rmtree, run
class TestDenoDir(DenoTestCase):
@@ -43,4 +42,4 @@ class TestDenoDir(DenoTestCase):
if __name__ == '__main__':
- test_main()
+ run_tests()
diff --git a/tools/fetch_test.py b/tools/fetch_test.py
index 35118ab96..e8c54dfec 100755
--- a/tools/fetch_test.py
+++ b/tools/fetch_test.py
@@ -1,11 +1,11 @@
#!/usr/bin/env python
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import os
-import sys
import shutil
-from http_server import spawn
-from util import DenoTestCase, mkdtemp, tests_path, run_output, test_main
+import http_server
+from test_util import DenoTestCase, run_tests
+from util import mkdtemp, tests_path, run_output
class FetchTest(DenoTestCase):
@@ -26,5 +26,5 @@ class FetchTest(DenoTestCase):
if __name__ == "__main__":
- with spawn():
- test_main()
+ with http_server.spawn():
+ run_tests()
diff --git a/tools/fmt_test.py b/tools/fmt_test.py
index 1d21fb740..0be2d2eff 100755
--- a/tools/fmt_test.py
+++ b/tools/fmt_test.py
@@ -1,11 +1,10 @@
#!/usr/bin/env python
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
-import json
import os
import shutil
-import sys
-from util import (DenoTestCase, mkdtemp, root_path, tests_path, run, test_main)
+from test_util import DenoTestCase, run_tests
+from util import mkdtemp, root_path, tests_path, run
class FmtTest(DenoTestCase):
@@ -43,4 +42,4 @@ class FmtTest(DenoTestCase):
if __name__ == "__main__":
- test_main()
+ run_tests()
diff --git a/tools/integration_tests.py b/tools/integration_tests.py
index 0f02ae2c5..6ce4f3d8b 100755
--- a/tools/integration_tests.py
+++ b/tools/integration_tests.py
@@ -7,16 +7,13 @@
# exit code can be specified.
#
# Usage: integration_tests.py [path to deno executable]
-import argparse
import os
import re
-import sys
import subprocess
-import unittest
-from http_server import spawn
-from util import (DenoTestCase, ColorTextTestRunner, root_path, tests_path,
- pattern_match, rmtree, test_main)
+import http_server
+from test_util import DenoTestCase, run_tests
+from util import root_path, tests_path, pattern_match, rmtree
def strip_ansi_codes(s):
@@ -107,36 +104,6 @@ for fn in sorted(
tn = t.__name__ = "test_" + fn.split(".")[0]
setattr(TestIntegrations, tn, t)
-
-def main():
- parser = argparse.ArgumentParser()
- parser.add_argument("--filter", help="Run specific tests")
- parser.add_argument(
- "--release", help="Use release build of Deno", action="store_true")
- parser.add_argument("--executable", help="Use external executable of Deno")
- args = parser.parse_args()
-
- target = "release" if args.release else "debug"
- build_dir = os.environ.get("DENO_BUILD_PATH",
- os.path.join(root_path, "target", target))
-
- deno_dir = os.path.join(build_dir, ".deno_test")
- if os.path.isdir(deno_dir):
- rmtree(deno_dir)
- os.environ["DENO_DIR"] = deno_dir
-
- test_names = [
- test_name for test_name in unittest.TestLoader().getTestCaseNames(
- TestIntegrations) if not args.filter or args.filter in test_name
- ]
- suite = unittest.TestLoader().loadTestsFromNames(
- test_names, module=TestIntegrations)
-
- with spawn():
- result = ColorTextTestRunner(verbosity=2).run(suite)
- if not result.wasSuccessful():
- sys.exit(1)
-
-
if __name__ == "__main__":
- main()
+ with http_server.spawn():
+ run_tests()
diff --git a/tools/is_tty_test.py b/tools/is_tty_test.py
index 79267fdd5..16a4ef255 100755
--- a/tools/is_tty_test.py
+++ b/tools/is_tty_test.py
@@ -1,11 +1,11 @@
#!/usr/bin/env python
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import os
-import subprocess
import unittest
from sys import stdin
-from util import DenoTestCase, test_main, tty_capture
+from test_util import DenoTestCase, run_tests
+from util import tty_capture
IS_TTY_TEST_TS = "tests/is_tty.ts"
@@ -20,4 +20,4 @@ class TestIsTty(DenoTestCase):
if __name__ == "__main__":
- test_main()
+ run_tests()
diff --git a/tools/permission_prompt_test.py b/tools/permission_prompt_test.py
index 735478816..68069cb0e 100755
--- a/tools/permission_prompt_test.py
+++ b/tools/permission_prompt_test.py
@@ -2,12 +2,10 @@
# -*- coding: utf-8 -*-
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import os
-import subprocess
-import sys
-import time
import unittest
-from util import DenoTestCase, test_main, tty_capture
+from test_util import DenoTestCase, run_tests
+from util import tty_capture
PERMISSIONS_PROMPT_TEST_TS = "tools/permission_prompt_test.ts"
@@ -143,4 +141,4 @@ def permission_prompt_tests():
if __name__ == "__main__":
- test_main()
+ run_tests()
diff --git a/tools/repl_test.py b/tools/repl_test.py
index 9cc345248..e8b1f1a6f 100644
--- a/tools/repl_test.py
+++ b/tools/repl_test.py
@@ -4,18 +4,10 @@ from subprocess import CalledProcessError, PIPE, Popen
import sys
import time
-from util import DenoTestCase, test_main
+from test_util import DenoTestCase, run_tests
class TestRepl(DenoTestCase):
- def __init__(self, *args, **kwargs):
- super(TestRepl, self).__init__(*args, **kwargs)
- self._warm_up()
-
- def _warm_up(self):
- # This may output an error message about the history file (ignore it).
- self.input("")
-
def input(self, *lines, **kwargs):
exit_ = kwargs.pop("exit", True)
sleep_ = kwargs.pop("sleep", 0)
@@ -141,4 +133,4 @@ class TestRepl(DenoTestCase):
if __name__ == "__main__":
- test_main()
+ run_tests()
diff --git a/tools/setup_test.py b/tools/setup_test.py
index e9d09de80..69e1ea349 100644
--- a/tools/setup_test.py
+++ b/tools/setup_test.py
@@ -6,7 +6,7 @@ from setup import gn_string, read_gn_args, write_gn_args
from shutil import rmtree
from tempfile import mktemp
-from util import DenoTestCase, test_main
+from test_util import DenoTestCase, run_tests
class TestSetup(DenoTestCase):
@@ -63,4 +63,4 @@ class TestSetup(DenoTestCase):
if __name__ == '__main__':
- test_main()
+ run_tests()
diff --git a/tools/target_test.py b/tools/target_test.py
new file mode 100644
index 000000000..3f1ddb8b5
--- /dev/null
+++ b/tools/target_test.py
@@ -0,0 +1,60 @@
+import os
+import sys
+
+from test_util import DenoTestCase, run_tests
+from util import executable_suffix, run, tests_path, run_output
+
+
+class TestTarget(DenoTestCase):
+ @staticmethod
+ def check_exists(filename):
+ if not os.path.exists(filename):
+ print "Required target doesn't exist:", filename
+ print "Run ./tools/build.py"
+ sys.exit(1)
+
+ def test_executable_exists(self):
+ self.check_exists(self.deno_exe)
+
+ def _test(self, executable):
+ "Test executable runs and exits with code 0."
+ bin_file = os.path.join(self.build_dir, executable + executable_suffix)
+ self.check_exists(bin_file)
+ run([bin_file])
+
+ def test_libdeno(self):
+ self._test("libdeno_test")
+
+ def test_cli(self):
+ self._test("cli_test")
+
+ def test_core(self):
+ self._test("deno_core_test")
+
+ def test_core_http_benchmark(self):
+ self._test("deno_core_http_bench_test")
+
+ def test_ts_library_builder(self):
+ run([
+ "node", "./node_modules/.bin/ts-node", "--project",
+ "tools/ts_library_builder/tsconfig.json",
+ "tools/ts_library_builder/test.ts"
+ ])
+
+ def test_no_color(self):
+ t = os.path.join(tests_path, "no_color.js")
+ output = run_output([self.deno_exe, "run", t],
+ merge_env={"NO_COLOR": "1"})
+ assert output.strip() == "noColor true"
+ t = os.path.join(tests_path, "no_color.js")
+ output = run_output([self.deno_exe, "run", t])
+ assert output.strip() == "noColor false"
+
+ def test_exec_path(self):
+ cmd = [self.deno_exe, "run", "tests/exec_path.ts"]
+ output = run_output(cmd)
+ assert self.deno_exe in output.strip()
+
+
+if __name__ == "main":
+ run_tests()
diff --git a/tools/test.py b/tools/test.py
index 3a44748a2..ad45f186a 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -3,9 +3,6 @@
# Runs the full test suite.
# Usage: ./tools/test.py out/Debug
import os
-import subprocess
-import sys
-import unittest
from benchmark_test import TestBenchmark
from deno_dir_test import TestDenoDir
@@ -14,73 +11,22 @@ from fmt_test import FmtTest
from integration_tests import TestIntegrations
from repl_test import TestRepl
from setup_test import TestSetup
+from target_test import TestTarget
from unit_tests import JsUnitTests
from util_test import TestUtil
-
-from is_tty_test import TestIsTty
# NOTE: These tests are skipped on Windows
+from is_tty_test import TestIsTty
from permission_prompt_test import permission_prompt_tests
from complex_permissions_test import complex_permissions_tests
-from http_server import spawn
-from util import (DenoTestCase, ColorTextTestRunner, enable_ansi_colors,
- executable_suffix, run, run_output, rmtree, tests_path,
- test_args)
-
-
-class TestTarget(DenoTestCase):
- @staticmethod
- def check_exists(filename):
- if not os.path.exists(filename):
- print "Required target doesn't exist:", filename
- print "Run ./tools/build.py"
- sys.exit(1)
-
- def test_executable_exists(self):
- self.check_exists(self.deno_exe)
-
- def _test(self, executable):
- "Test executable runs and exits with code 0."
- bin_file = os.path.join(self.build_dir, executable + executable_suffix)
- self.check_exists(bin_file)
- run([bin_file])
-
- def test_libdeno(self):
- self._test("libdeno_test")
+import http_server
+from util import (enable_ansi_colors, build_path, RESET, FG_RED, FG_GREEN,
+ executable_suffix, run, run_output, rmtree, tests_path)
+from test_util import parse_test_args, run_tests
- def test_cli(self):
- self._test("cli_test")
- def test_core(self):
- self._test("deno_core_test")
-
- def test_core_http_benchmark(self):
- self._test("deno_core_http_bench_test")
-
- def test_ts_library_builder(self):
- run([
- "node", "./node_modules/.bin/ts-node", "--project",
- "tools/ts_library_builder/tsconfig.json",
- "tools/ts_library_builder/test.ts"
- ])
-
- def test_no_color(self):
- t = os.path.join(tests_path, "no_color.js")
- output = run_output([self.deno_exe, "run", t],
- merge_env={"NO_COLOR": "1"})
- assert output.strip() == "noColor true"
- t = os.path.join(tests_path, "no_color.js")
- output = run_output([self.deno_exe, "run", t])
- assert output.strip() == "noColor false"
-
- def test_exec_path(self):
- cmd = [self.deno_exe, "run", "tests/exec_path.ts"]
- output = run_output(cmd)
- assert self.deno_exe in output.strip()
-
-
-def main(argv):
- args = test_args(argv)
+def main():
+ args = parse_test_args()
deno_dir = os.path.join(args.build_dir, ".deno_test")
if os.path.isdir(deno_dir):
@@ -89,36 +35,25 @@ def main(argv):
enable_ansi_colors()
- with spawn():
- test_cases = [
- TestSetup,
- TestUtil,
- TestTarget,
- JsUnitTests,
- FetchTest,
- FmtTest,
- TestIntegrations,
- TestRepl,
- TestDenoDir,
- TestBenchmark,
- ]
- # These tests are skipped, but to make the test output less noisy
- # we'll avoid triggering them.
- if os.name != 'nt':
- test_cases.append(TestIsTty)
- test_cases += permission_prompt_tests()
- test_cases += complex_permissions_tests()
-
- suite = unittest.TestSuite([
- unittest.TestLoader().loadTestsFromTestCase(tc)
- for tc in test_cases
- ])
-
- result = ColorTextTestRunner(
- verbosity=args.verbosity + 1, failfast=args.failfast).run(suite)
- if not result.wasSuccessful():
- sys.exit(1)
+ test_cases = [
+ TestSetup,
+ TestUtil,
+ TestTarget,
+ JsUnitTests,
+ FetchTest,
+ FmtTest,
+ TestIntegrations,
+ TestRepl,
+ TestDenoDir,
+ TestBenchmark,
+ TestIsTty,
+ ]
+ test_cases += permission_prompt_tests()
+ test_cases += complex_permissions_tests()
+
+ with http_server.spawn():
+ run_tests(test_cases)
if __name__ == '__main__':
- main(sys.argv[1:])
+ main()
diff --git a/tools/test_util.py b/tools/test_util.py
new file mode 100644
index 000000000..cec181ac0
--- /dev/null
+++ b/tools/test_util.py
@@ -0,0 +1,140 @@
+#!/usr/bin/env python
+# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+# Runs the full test suite.
+# Usage: ./tools/test.py out/Debug
+import argparse
+import os
+import sys
+import unittest
+
+from util import (enable_ansi_colors, build_path, RESET, FG_RED, FG_GREEN,
+ executable_suffix, run, run_output, rmtree, tests_path)
+
+
+class DenoTestCase(unittest.TestCase):
+ @classmethod
+ def setUpClass(cls):
+ args = parse_test_args()
+
+ cls.build_dir = args.build_dir
+ cls.deno_exe = args.executable
+
+
+# overload the test result class
+class ColorTextTestResult(unittest.TextTestResult):
+ def getDescription(self, test):
+ name = str(test)
+ if name.startswith("test_"):
+ name = name[5:]
+ return name
+
+ def addSuccess(self, test):
+ if self.showAll:
+ self.stream.write(FG_GREEN)
+ super(ColorTextTestResult, self).addSuccess(test)
+ if self.showAll:
+ self.stream.write(RESET)
+
+ def addError(self, test, err):
+ if self.showAll:
+ self.stream.write(FG_RED)
+ super(ColorTextTestResult, self).addError(test, err)
+ if self.showAll:
+ self.stream.write(RESET)
+
+ def addFailure(self, test, err):
+ if self.showAll:
+ self.stream.write(FG_RED)
+ super(ColorTextTestResult, self).addFailure(test, err)
+ if self.showAll:
+ self.stream.write(RESET)
+
+
+class ColorTextTestRunner(unittest.TextTestRunner):
+ resultclass = ColorTextTestResult
+
+
+def create_test_arg_parser():
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ '--failfast', '-f', action='store_true', help='Stop on first failure')
+ parser.add_argument(
+ '--verbose', '-v', action='store_true', help='Verbose output')
+ parser.add_argument("--executable", help="Use external executable of Deno")
+ parser.add_argument(
+ '--release',
+ action='store_true',
+ help='Test against release executable')
+ parser.add_argument(
+ '--pattern', '-p', help='Run tests that match provided pattern')
+ parser.add_argument(
+ '--build-dir', dest="build_dir", help='Deno build directory')
+ return parser
+
+
+TestArgParser = create_test_arg_parser()
+
+
+def parse_test_args(argv=None):
+ if argv is None:
+ argv = sys.argv[1:]
+
+ args = TestArgParser.parse_args(argv)
+
+ if args.executable and args.release:
+ raise argparse.ArgumentError(
+ None, "Path to executable is inferred from "
+ "--release, cannot provide both.")
+
+ if not args.build_dir:
+ args.build_dir = build_path()
+
+ if not args.executable:
+ args.executable = os.path.join(args.build_dir,
+ "deno" + executable_suffix)
+
+ if not os.path.isfile(args.executable):
+ raise argparse.ArgumentError(
+ None, "deno executable not found at {}".format(args.executable))
+
+ return args
+
+
+def filter_test_suite(suite, pattern):
+ filtered_tests = []
+
+ for test_case in suite:
+ if isinstance(test_case, unittest.TestSuite):
+ filtered_tests += filter_test_suite(test_case, pattern)
+ else:
+ if pattern in str(test_case):
+ filtered_tests.append(test_case)
+
+ return filtered_tests
+
+
+def run_tests(test_cases=None):
+ args = parse_test_args()
+
+ loader = unittest.TestLoader()
+
+ # if suite was not explicitly passed load test
+ # cases from calling module
+ if test_cases is None:
+ import __main__
+ suite = loader.loadTestsFromModule(__main__)
+ else:
+ suite = unittest.TestSuite()
+ for test_case in test_cases:
+ suite.addTests(loader.loadTestsFromTestCase(test_case))
+
+ if args.pattern:
+ filtered_tests = filter_test_suite(suite, args.pattern)
+ suite = unittest.TestSuite(filtered_tests)
+
+ runner = ColorTextTestRunner(
+ verbosity=args.verbose + 1, failfast=args.failfast)
+
+ result = runner.run(suite)
+ if not result.wasSuccessful():
+ sys.exit(1)
diff --git a/tools/unit_tests.py b/tools/unit_tests.py
index 439ea325f..f8cd1af64 100755
--- a/tools/unit_tests.py
+++ b/tools/unit_tests.py
@@ -3,8 +3,8 @@
import sys
import subprocess
-from http_server import spawn
-from util import DenoTestCase, test_main
+import http_server
+from test_util import DenoTestCase, run_tests
class JsUnitTests(DenoTestCase):
@@ -24,5 +24,5 @@ class JsUnitTests(DenoTestCase):
if __name__ == '__main__':
- with spawn():
- test_main()
+ with http_server.spawn():
+ run_tests()
diff --git a/tools/util.py b/tools/util.py
index c6f8a4c82..1ca4752a8 100644
--- a/tools/util.py
+++ b/tools/util.py
@@ -1,5 +1,4 @@
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
-import argparse
import os
import re
import shutil
@@ -9,12 +8,13 @@ import sys
import subprocess
import tempfile
import time
-import unittest
-# FIXME support nocolor (use "" if passed?)
-RESET = "\x1b[0m"
-FG_RED = "\x1b[31m"
-FG_GREEN = "\x1b[32m"
+if os.environ.get("NO_COLOR", None):
+ RESET = FG_READ = FG_GREEN = ""
+else:
+ RESET = "\x1b[0m"
+ FG_RED = "\x1b[31m"
+ FG_GREEN = "\x1b[32m"
executable_suffix = ".exe" if os.name == "nt" else ""
root_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
@@ -373,88 +373,6 @@ def mkdtemp():
return tempfile.mkdtemp(dir=temp_dir)
-class DenoTestCase(unittest.TestCase):
- @property
- def build_dir(self):
- args = test_args()
- return args.build_dir
-
- @property
- def deno_exe(self):
- return os.path.join(self.build_dir, "deno" + executable_suffix)
-
-
-# overload the test result class
-class ColorTextTestResult(unittest.TextTestResult):
- def getDescription(self, test):
- name = str(test)
- if name.startswith("test_"):
- name = name[5:]
- return name
-
- def addSuccess(self, test):
- if self.showAll:
- self.stream.write(FG_GREEN)
- super(ColorTextTestResult, self).addSuccess(test)
- if self.showAll:
- self.stream.write(RESET)
-
- def addError(self, test, err):
- if self.showAll:
- self.stream.write(FG_RED)
- super(ColorTextTestResult, self).addError(test, err)
- if self.showAll:
- self.stream.write(RESET)
-
- def addFailure(self, test, err):
- if self.showAll:
- self.stream.write(FG_RED)
- super(ColorTextTestResult, self).addFailure(test, err)
- if self.showAll:
- self.stream.write(RESET)
-
-
-class ColorTextTestRunner(unittest.TextTestRunner):
- resultclass = ColorTextTestResult
-
-
-def test_main():
- args = test_args()
- # FIXME(hayd) support more of the unittest.main API.
- return unittest.main(
- verbosity=args.verbosity + 1,
- testRunner=ColorTextTestRunner,
- failfast=args.failfast,
- argv=[''])
-
-
-def test_args(argv=None):
- if argv is None:
- argv = sys.argv[1:]
- parser = argparse.ArgumentParser()
- parser.add_argument(
- '--failfast', '-f', action='store_true', help='Stop on first failure')
- parser.add_argument(
- '--verbosity', '-v', action='store_true', help='Verbose output')
- parser.add_argument(
- '--release',
- action='store_true',
- help='Test against release deno_executable')
- parser.add_argument('build_dir', nargs='?', help='Deno build directory')
- args = parser.parse_args(argv)
- if args.build_dir and args.release:
- raise argparse.ArgumentError(
- None, "build_dir is inferred from --release, cannot provide both")
- if not args.build_dir:
- args.build_dir = build_path()
-
- if not os.path.isfile(
- os.path.join(args.build_dir, "deno" + executable_suffix)):
- raise argparse.ArgumentError(None,
- "deno executable not found in build_dir")
- return args
-
-
# This function is copied from:
# https://gist.github.com/hayd/4f46a68fc697ba8888a7b517a414583e
# https://stackoverflow.com/q/52954248/1240268
diff --git a/tools/util_test.py b/tools/util_test.py
index 5db50e420..fb6c59f18 100755
--- a/tools/util_test.py
+++ b/tools/util_test.py
@@ -1,16 +1,9 @@
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import os
-import sys
-from util import (
- DenoTestCase,
- pattern_match,
- parse_exit_code,
- shell_quote_win,
- parse_wrk_output,
- root_path,
- test_main,
-)
+from test_util import DenoTestCase, run_tests
+from util import (pattern_match, parse_exit_code, shell_quote_win,
+ parse_wrk_output, root_path)
class TestUtil(DenoTestCase):
@@ -70,4 +63,4 @@ class TestUtil(DenoTestCase):
if __name__ == '__main__':
- test_main()
+ run_tests()