diff options
-rw-r--r-- | .appveyor.yml | 2 | ||||
-rwxr-xr-x | tools/benchmark_test.py | 4 | ||||
-rwxr-xr-x | tools/complex_permissions_test.py | 24 | ||||
-rwxr-xr-x | tools/deno_dir_test.py | 7 | ||||
-rwxr-xr-x | tools/fetch_test.py | 10 | ||||
-rwxr-xr-x | tools/fmt_test.py | 7 | ||||
-rwxr-xr-x | tools/integration_tests.py | 43 | ||||
-rwxr-xr-x | tools/is_tty_test.py | 6 | ||||
-rwxr-xr-x | tools/permission_prompt_test.py | 8 | ||||
-rw-r--r-- | tools/repl_test.py | 12 | ||||
-rw-r--r-- | tools/setup_test.py | 4 | ||||
-rw-r--r-- | tools/target_test.py | 60 | ||||
-rwxr-xr-x | tools/test.py | 119 | ||||
-rw-r--r-- | tools/test_util.py | 140 | ||||
-rwxr-xr-x | tools/unit_tests.py | 8 | ||||
-rw-r--r-- | tools/util.py | 94 | ||||
-rwxr-xr-x | tools/util_test.py | 15 |
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() |