File Explorer

/var/lang/lib/node_modules/npm/node_modules/node-gyp/gyp

This explorer reads the filesystem of the server it runs on, so /workspace/user isn't present here. Browsing and the terminal still work against this server's own disk from /.

3 dirs
8 files
test_gyp.py7.5 KB · 261 lines
#!/usr/bin/env python3# Copyright (c) 2012 Google Inc. All rights reserved.# Use of this source code is governed by a BSD-style license that can be# found in the LICENSE file. """gyptest.py -- test runner for GYP tests.""" import argparseimport osimport platformimport subprocessimport sysimport time  def is_test_name(f):    return f.startswith("gyptest") and f.endswith(".py")  def find_all_gyptest_files(directory):    result = []    for root, dirs, files in os.walk(directory):        result.extend([os.path.join(root, f) for f in files if is_test_name(f)])    result.sort()    return result  def main(argv=None):    if argv is None:        argv = sys.argv     parser = argparse.ArgumentParser()    parser.add_argument("-a", "--all", action="store_true", help="run all tests")    parser.add_argument("-C", "--chdir", action="store", help="change to directory")    parser.add_argument(        "-f",        "--format",        action="store",        default="",        help="run tests with the specified formats",    )    parser.add_argument(        "-G",        "--gyp_option",        action="append",        default=[],        help="Add -G options to the gyp command line",    )    parser.add_argument(        "-l", "--list", action="store_true", help="list available tests and exit"    )    parser.add_argument(        "-n",        "--no-exec",        action="store_true",        help="no execute, just print the command line",    )    parser.add_argument(        "--path", action="append", default=[], help="additional $PATH directory"    )    parser.add_argument(        "-q",        "--quiet",        action="store_true",        help="quiet, don't print anything unless there are failures",    )    parser.add_argument(        "-v",        "--verbose",        action="store_true",        help="print configuration info and test results.",    )    parser.add_argument("tests", nargs="*")    args = parser.parse_args(argv[1:])     if args.chdir:        os.chdir(args.chdir)     if args.path:        extra_path = [os.path.abspath(p) for p in args.path]        extra_path = os.pathsep.join(extra_path)        os.environ["PATH"] = extra_path + os.pathsep + os.environ["PATH"]     if not args.tests:        if not args.all:            sys.stderr.write("Specify -a to get all tests.\n")            return 1        args.tests = ["test"]     tests = []    for arg in args.tests:        if os.path.isdir(arg):            tests.extend(find_all_gyptest_files(os.path.normpath(arg)))        else:            if not is_test_name(os.path.basename(arg)):                print(arg, "is not a valid gyp test name.", file=sys.stderr)                sys.exit(1)            tests.append(arg)     if args.list:        for test in tests:            print(test)        sys.exit(0)     os.environ["PYTHONPATH"] = os.path.abspath("test/lib")     if args.verbose:        print_configuration_info()     if args.gyp_option and not args.quiet:        print("Extra Gyp options: %s\n" % args.gyp_option)     if args.format:        format_list = args.format.split(",")    else:        format_list = {            "aix5": ["make"],            "os400": ["make"],            "freebsd7": ["make"],            "freebsd8": ["make"],            "openbsd5": ["make"],            "cygwin": ["msvs"],            "win32": ["msvs", "ninja"],            "linux": ["make", "ninja"],            "linux2": ["make", "ninja"],            "linux3": ["make", "ninja"],            # TODO: Re-enable xcode-ninja.            # https://bugs.chromium.org/p/gyp/issues/detail?id=530            # 'darwin':   ['make', 'ninja', 'xcode', 'xcode-ninja'],            "darwin": ["make", "ninja", "xcode"],        }[sys.platform]     gyp_options = []    for option in args.gyp_option:        gyp_options += ["-G", option]     runner = Runner(format_list, tests, gyp_options, args.verbose)    runner.run()     if not args.quiet:        runner.print_results()     return 1 if runner.failures else 0  def print_configuration_info():    print("Test configuration:")    if sys.platform == "darwin":        sys.path.append(os.path.abspath("test/lib"))        import TestMac  # noqa: PLC0415         print(f"  Mac {platform.mac_ver()[0]} {platform.mac_ver()[2]}")        print(f"  Xcode {TestMac.Xcode.Version()}")    elif sys.platform == "win32":        sys.path.append(os.path.abspath("pylib"))        import gyp.MSVSVersion  # noqa: PLC0415         print("  Win %s %s\n" % platform.win32_ver()[0:2])        print("  MSVS %s" % gyp.MSVSVersion.SelectVisualStudioVersion().Description())    elif sys.platform in ("linux", "linux2"):        print("  Linux %s" % " ".join(platform.linux_distribution()))    print(f"  Python {platform.python_version()}")    print(f"  PYTHONPATH={os.environ['PYTHONPATH']}")    print()  class Runner:    def __init__(self, formats, tests, gyp_options, verbose):        self.formats = formats        self.tests = tests        self.verbose = verbose        self.gyp_options = gyp_options        self.failures = []        self.num_tests = len(formats) * len(tests)        num_digits = len(str(self.num_tests))        self.fmt_str = "[%%%dd/%%%dd] (%%s) %%s" % (num_digits, num_digits)        self.isatty = sys.stdout.isatty() and not self.verbose        self.env = os.environ.copy()        self.hpos = 0     def run(self):        run_start = time.time()         i = 1        for fmt in self.formats:            for test in self.tests:                self.run_test(test, fmt, i)                i += 1         if self.isatty:            self.erase_current_line()         self.took = time.time() - run_start     def run_test(self, test, fmt, i):        if self.isatty:            self.erase_current_line()         msg = self.fmt_str % (i, self.num_tests, fmt, test)        self.print_(msg)         start = time.time()        cmd = [sys.executable, test] + self.gyp_options        self.env["TESTGYP_FORMAT"] = fmt        proc = subprocess.Popen(            cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=self.env        )        proc.wait()        took = time.time() - start         stdout = proc.stdout.read().decode("utf8")        if proc.returncode == 2:            res = "skipped"        elif proc.returncode:            res = "failed"            self.failures.append(f"({test}) {fmt}")        else:            res = "passed"        res_msg = f" {res} {took:.3f}s"        self.print_(res_msg)         if stdout and not stdout.endswith(("PASSED\n", "NO RESULT\n")):            print()            print("\n".join(f"    {line}" for line in stdout.splitlines()))        elif not self.isatty:            print()     def print_(self, msg):        print(msg, end="")        index = msg.rfind("\n")        if index == -1:            self.hpos += len(msg)        else:            self.hpos = len(msg) - index        sys.stdout.flush()     def erase_current_line(self):        print("\b" * self.hpos + " " * self.hpos + "\b" * self.hpos, end="")        sys.stdout.flush()        self.hpos = 0     def print_results(self):        num_failures = len(self.failures)        if num_failures:            print()            if num_failures == 1:                print("Failed the following test:")            else:                print("Failed the following %d tests:" % num_failures)            print("\t" + "\n\t".join(sorted(self.failures)))            print()        print(            "Ran %d tests in %.3fs, %d failed."            % (self.num_tests, self.took, num_failures)        )        print()  if __name__ == "__main__":    sys.exit(main())