Browse Source

Drop remaining nose files and requirements

pagure has been ported to use pytest instead of nose but
we still have files referrencing to the old way of running the
tests or even some outdated dependencies on our containers.

Signed-off-by: Pierre-Yves Chibon <pingou@pingoured.fr>
Pierre-Yves Chibon 3 years ago
parent
commit
85f82260ee
7 changed files with 1 additions and 749 deletions
  1. 1 1
      dev/containers/base
  2. 0 1
      dev/containers/centos7-rpms-py2
  3. 0 1
      dev/containers/fedora-rpms-py3
  4. 0 10
      nosetests
  5. 0 12
      nosetests3
  6. 0 683
      runtests.py
  7. 0 41
      utils/perfplugin.py

+ 1 - 1
dev/containers/base

@@ -14,7 +14,7 @@ RUN dnf -y update && \
                    python3-flake8 python3-flask python3-flask-oidc \
                    python3-flask-wtf python3-funcsigs python3-jinja2 \
                    python3-kitchen python3-markdown python3-mock \
-                   python3-munch python3-nose python3-nose-xcover \
+                   python3-munch \
                    python3-openid python3-openid-cla python3-openid-teams \
                    python3-pillow python3-psutil python3-psycopg2 \
                    python3-pygit2 python3-redis python3-requests \

+ 0 - 1
dev/containers/centos7-rpms-py2

@@ -17,7 +17,6 @@ RUN yum -y install \
     rpm-build \
     python-setuptools \
     python-coverage \
-    python-nose \
     python-mock \
     python-docutils \
     python-enum \

+ 0 - 1
dev/containers/fedora-rpms-py3

@@ -9,7 +9,6 @@ ENV BRANCH=$branch
 RUN dnf -y --enablerepo=updates-testing install \
     python3-setuptools \
     python3-coverage \
-    python3-nose \
     python3-mock \
     python3-docutils \
     python3-black \

+ 0 - 10
nosetests

@@ -1,10 +0,0 @@
-#!/usr/bin/env python
-# EASY-INSTALL-ENTRY-SCRIPT: 'nose==0.10.4','console_scripts','nosetests'
-__requires__ = ['nose>=0.10.4']
-import sys
-from pkg_resources import load_entry_point
-
-import nose.core
-from utils.perfplugin import PerfPlugin
-
-nose.core.main(addplugins=[PerfPlugin()])

+ 0 - 12
nosetests3

@@ -1,12 +0,0 @@
-#!/usr/bin/python3
-# EASY-INSTALL-ENTRY-SCRIPT: 'nose==1.3.7','console_scripts','nosetests-3.4'
-__requires__ = 'nose>=1.3.7'
-import sys
-from pkg_resources import load_entry_point
-
-if __name__ == '__main__':
-    sys.exit(
-        load_entry_point(
-            'nose>=1.3.7', 'console_scripts', 'nosetests-3.%s' %
-                sys.version_info.minor)()
-    )

+ 0 - 683
runtests.py

@@ -1,683 +0,0 @@
-#!/usr/bin/env python3
-
-from __future__ import print_function, unicode_literals, absolute_import
-
-import argparse
-import coverage
-import json
-import logging
-import multiprocessing
-import os
-import shutil
-import subprocess
-import sys
-import threading
-import time
-
-
-RUNNER_PY = "nosetests"
-RUNNER_PY2 = "nosetests-2"
-RUNNER_PY3 = "nosetests-3"
-COVER_PY = "coverage"
-COVER_PY2 = "coverage2"
-COVER_PY3 = "coverage3"
-
-LASTLEN = None
-NUMREMAINING = None
-PRINTLOCK = None
-RUNNING = []
-FAILED = []
-
-NUMPROCS = multiprocessing.cpu_count() - 1
-if os.environ.get("BUILD_ID"):
-    NUMPROCS = multiprocessing.cpu_count()
-if NUMPROCS < 1:
-    NUMPROCS = 1
-
-HERE = os.path.join(os.path.dirname(os.path.abspath(__file__)))
-LOG = logging.getLogger(__name__)
-
-
-def setup_parser():
-    """ Set up the command line arguments supported and return the arguments
-    """
-
-    parser = argparse.ArgumentParser(description="Run the Pagure tests")
-    parser.add_argument(
-        "--debug",
-        dest="debug",
-        action="store_true",
-        default=False,
-        help="Increase the level of data logged.",
-    )
-
-    subparsers = parser.add_subparsers(title="actions")
-
-    # RUN
-    parser_run = subparsers.add_parser("run", help="Run the tests")
-    parser_run.add_argument(
-        "--py2",
-        dest="py2",
-        action="store_true",
-        default=False,
-        help="Runs the tests only in python2 instead of both python2 and python3",
-    )
-    parser_run.add_argument(
-        "--py3",
-        dest="py3",
-        action="store_true",
-        default=False,
-        help="Runs the tests only in python3 instead of both python2 and python3",
-    )
-    parser_run.add_argument(
-        "--results",
-        default="results",
-        help="Specify a folder in which the results should be placed "
-        "(defaults to `results`)",
-    )
-    parser_run.add_argument(
-        "-f",
-        "--force",
-        default=False,
-        action="store_true",
-        help="Override the results and newfailed file without asking you",
-    )
-    parser_run.add_argument(
-        "--with-coverage",
-        default=False,
-        action="store_true",
-        help="Also build coverage report",
-    )
-    parser_run.add_argument(
-        "failed_tests",
-        nargs="?",
-        help="File containing a JSON list of the failed tests to run or "
-        "pointing to a test file to run.",
-    )
-    parser_run.set_defaults(func=do_run)
-
-    # RERUN
-    parser_run = subparsers.add_parser("rerun", help="Run failed tests")
-    parser_run.add_argument(
-        "--debug",
-        dest="debug",
-        action="store_true",
-        default=False,
-        help="Expand the level of data returned.",
-    )
-    parser_run.add_argument(
-        "--py2",
-        dest="py2",
-        action="store_true",
-        default=False,
-        help="Runs the tests only in python2 instead of both python2 and python3",
-    )
-    parser_run.add_argument(
-        "--py3",
-        dest="py3",
-        action="store_true",
-        default=False,
-        help="Runs the tests only in python3 instead of both python2 and python3",
-    )
-    parser_run.add_argument(
-        "--results",
-        default="results",
-        help="Specify a folder in which the results should be placed "
-        "(defaults to `results`)",
-    )
-    parser_run.add_argument(
-        "--with-coverage",
-        default=False,
-        action="store_true",
-        help="Also build coverage report",
-    )
-    parser_run.set_defaults(func=do_rerun)
-
-    # LIST
-    parser_run = subparsers.add_parser("list", help="List failed tests")
-    parser_run.add_argument(
-        "--results",
-        default="results",
-        help="Specify a folder in which the results should be placed "
-        "(defaults to `results`)",
-    )
-    parser_run.add_argument(
-        "--show",
-        default=False,
-        action="store_true",
-        help="Show the error files using `less`",
-    )
-    parser_run.add_argument(
-        "-n",
-        default=None,
-        nargs="?",
-        type=int,
-        help="Number of failed test to show",
-    )
-    parser_run.set_defaults(func=do_list)
-
-    # SHOW-COVERAGE
-    parser_run = subparsers.add_parser(
-        "show-coverage",
-        help="Shows the coverage report from the data in the results folder",
-    )
-    parser_run.add_argument(
-        "--debug",
-        dest="debug",
-        action="store_true",
-        default=False,
-        help="Expand the level of data returned.",
-    )
-    parser_run.add_argument(
-        "--py2",
-        dest="py2",
-        action="store_true",
-        default=False,
-        help="Runs the tests only in python2 instead of both python2 and python3",
-    )
-    parser_run.add_argument(
-        "--py3",
-        dest="py3",
-        action="store_true",
-        default=False,
-        help="Runs the tests only in python3 instead of both python2 and python3",
-    )
-    parser_run.add_argument(
-        "--results",
-        default="results",
-        help="Specify a folder in which the results should be placed "
-        "(defaults to `results`)",
-    )
-    parser_run.set_defaults(func=do_show_coverage)
-
-    return parser
-
-
-def clean_line():
-    global LASTLEN
-
-    with PRINTLOCK:
-        if LASTLEN is not None:
-            print(" " * LASTLEN, end="\r")
-        LASTLEN = None
-
-
-def print_running():
-    global LASTLEN
-
-    with PRINTLOCK:
-        msg = "Running %d suites: %d remaining, %d failed" % (
-            len(RUNNING),
-            NUMREMAINING,
-            len(FAILED),
-        )
-        LASTLEN = len(msg)
-        print(msg, end="\r")
-
-
-def add_running(suite):
-    global NUMREMAINING
-
-    with PRINTLOCK:
-        NUMREMAINING -= 1
-        RUNNING.append(suite)
-        clean_line()
-        print_running()
-
-
-def remove_running(suite, failed):
-    with PRINTLOCK:
-        RUNNING.remove(suite)
-        clean_line()
-        status = "passed"
-        if failed:
-            status = "FAILED"
-        print("Test suite %s: %s" % (status, suite))
-        print_running()
-
-
-class WorkerThread(threading.Thread):
-    def __init__(self, sem, pyver, suite, results, with_cover):
-        name = "py%s-%s" % (pyver, suite)
-        super(WorkerThread, self).__init__(name="worker-%s" % name)
-        self.name = name
-        self.sem = sem
-        self.pyver = pyver
-        self.suite = suite
-        self.failed = None
-        self.results = results
-        self.with_cover = with_cover
-
-    def run(self):
-        with self.sem:
-            add_running(self.name)
-            with open(os.path.join(self.results, self.name), "w") as resfile:
-                if self.pyver == 2:
-                    runner = RUNNER_PY2
-                elif self.pyver == 3:
-                    runner = RUNNER_PY3
-                else:
-                    runner = RUNNER_PY
-                cmd = [runner, "-v", "tests.%s" % self.suite]
-                if self.with_cover:
-                    cmd.append("--with-cover")
-
-                env = os.environ.copy()
-                env.update(
-                    {
-                        "PAGURE_CONFIG": "../tests/test_config",
-                        "COVERAGE_FILE": os.path.join(
-                            self.results, "%s.coverage" % self.name
-                        ),
-                        "LANG": "en_US.UTF-8",
-                    }
-                )
-                proc = subprocess.Popen(
-                    cmd,
-                    cwd=".",
-                    stdout=resfile,
-                    stderr=subprocess.STDOUT,
-                    env=env,
-                )
-                res = proc.wait()
-                if res == 0:
-                    self.failed = False
-                else:
-                    self.failed = True
-            if not self.failed is not True:
-                with PRINTLOCK:
-                    FAILED.append(self.name)
-            remove_running(self.name, self.failed)
-
-
-def do_run(args):
-    """ Performs some checks and runs the tests.
-    """
-
-    # Some pre-flight checks
-    if not os.path.exists("./.git") or not os.path.exists("./nosetests3"):
-        print("Please run from a single level into the Pagure codebase")
-        return 1
-
-    if os.path.exists(args.results):
-        if not args.force:
-            print(
-                "Results folder exists, please remove it so we do not clobber"
-                " or use --force"
-            )
-            return 1
-        else:
-            try:
-                shutil.rmtree(args.results)
-                os.mkdir(args.results)
-            except:
-                print(
-                    "Could not delete the %s directory, it will be "
-                    "wiped clean" % args.results
-                )
-                for content in os.listdir(args.results):
-                    os.remove(content)
-    else:
-        os.mkdir(args.results)
-
-    print("Pre-flight checks passed")
-
-    suites = []
-
-    if args.failed_tests:
-        here = os.path.join(os.path.dirname(os.path.abspath(__file__)))
-        failed_tests_fullpath = os.path.join(here, args.failed_tests)
-        if not os.path.exists(failed_tests_fullpath):
-            print(
-                "Could not find the specified file:%s" % failed_tests_fullpath
-            )
-            return 1
-        print("Loading failed tests")
-        try:
-            with open(failed_tests_fullpath, "r") as ffile:
-                suites = json.loads(ffile.read())
-        except:
-            bname = os.path.basename(args.failed_tests)
-            if bname.endswith(".py") and bname.startswith("test_"):
-                suites.append(bname.replace(".py", ""))
-
-    if len(suites) == 0:
-        print("Loading all tests")
-        for fname in os.listdir("./tests"):
-            if not fname.endswith(".py"):
-                continue
-            if not fname.startswith("test_"):
-                continue
-            suites.append(fname.replace(".py", ""))
-
-    return _run_test_suites(args, suites)
-
-
-def do_rerun(args):
-    """ Re-run tests that failed the last/specified run.
-    """
-
-    # Some pre-flight checks
-    if not os.path.exists("./.git") or not os.path.exists("./pagure"):
-        print("Please run from a single level into the Pagure codebase")
-        return 1
-
-    if not os.path.exists(args.results):
-        print(
-            "Could not find an existing results folder at: %s" % args.results
-        )
-        return 1
-
-    if not os.path.exists(os.path.join(args.results, "newfailed")):
-        print(
-            "Could not find an failed tests in the results folder at: %s"
-            % args.results
-        )
-        return 1
-
-    print("Pre-flight checks passed")
-
-    suites = []
-    tmp = []
-
-    print("Loading failed tests")
-    try:
-        with open(os.path.join(args.results, "newfailed"), "r") as ffile:
-            tmp = json.loads(ffile.read())
-    except json.decoder.JSONDecodeError:
-        print("File containing the failed tests is not JSON")
-        return 1
-
-    for suite in tmp:
-        if suite.startswith(("py2-", "py3-")):
-            suites.append(suite[4:])
-
-    return _run_test_suites(args, set(suites))
-
-
-def _get_pyvers(args):
-    pyvers = [2, 3]
-    if args.py2:
-        pyvers = [2]
-    elif args.py3:
-        pyvers = [3]
-
-    un_versioned = False
-    try:
-        subprocess.check_call(["which", RUNNER_PY])
-        un_versioned = True
-    except subprocess.CalledProcessError:
-        print("No %s found  no unversioned runner" % RUNNER_PY)
-
-    if 2 in pyvers:
-        nopy2 = False
-        try:
-            subprocess.check_call(["which", RUNNER_PY2])
-        except subprocess.CalledProcessError:
-            print("No %s found, removing python 2" % RUNNER_PY2)
-            del pyvers[pyvers.index(2)]
-
-    if 3 in pyvers:
-        nopy3 = False
-        try:
-            subprocess.check_call(["which", RUNNER_PY3])
-        except subprocess.CalledProcessError:
-            print("No %s found, removing python 3" % RUNNER_PY3)
-            del pyvers[pyvers.index(3)]
-
-    if not pyvers and un_versioned:
-        pyvers = [""]
-
-    return pyvers
-
-
-def _run_test_suites(args, suites):
-    print("Using %d processes" % NUMPROCS)
-    print("Start timing")
-    start = time.time()
-
-    global PRINTLOCK
-    PRINTLOCK = threading.RLock()
-    global NUMREMAINING
-    NUMREMAINING = 0
-
-    sem = threading.BoundedSemaphore(NUMPROCS)
-
-    # Create a worker per test
-    workers = {}
-
-    pyvers = _get_pyvers(args)
-
-    if not pyvers:
-        return 1
-
-    if len(pyvers) == 1:
-        if pyvers[0] == 2:
-            subprocess.check_call(
-                [
-                    "sed",
-                    "-i",
-                    "-e",
-                    "s|python|python2|",
-                    "pagure/hooks/files/hookrunner",
-                ]
-            )
-            subprocess.check_call(
-                [
-                    "sed",
-                    "-i",
-                    "-e",
-                    "s|\['alembic',|\['alembic-2',|",
-                    "tests/test_alembic.py",
-                ]
-            )
-        elif pyvers[0] == 3:
-            subprocess.check_call(
-                [
-                    "sed",
-                    "-i",
-                    "-e",
-                    "s|python|python3|",
-                    "pagure/hooks/files/hookrunner",
-                ],
-                cwd=HERE,
-            )
-            subprocess.check_call(
-                [
-                    "sed",
-                    "-i",
-                    "-e",
-                    "s|\['alembic',|\['alembic-3',|",
-                    "tests/test_alembic.py",
-                ],
-                cwd=HERE,
-            )
-
-    for suite in suites:
-        for pyver in pyvers:
-            NUMREMAINING += 1
-            workers["py%s-%s" % (pyver, suite)] = WorkerThread(
-                sem, pyver, suite, args.results, args.with_coverage
-            )
-
-    # Start the workers
-    print("Starting the workers")
-    print()
-    print()
-    for worker in workers.values():
-        worker.start()
-
-    # Wait for them to terminate
-    for worker in workers:
-        workers[worker].join()
-    print_running()
-    print()
-    print("All work done")
-
-    subprocess.check_call(
-        [
-            "git",
-            "checkout",
-            "pagure/hooks/files/hookrunner",
-            "tests/test_alembic.py",
-        ]
-    )
-
-    # Gather results
-    print()
-    print()
-
-    if FAILED:
-        print("Failed tests:")
-        for worker in workers:
-            if not workers[worker].failed:
-                continue
-            print("FAILED test: %s" % (worker))
-
-    # Write failed
-    if FAILED:
-        with open(os.path.join(args.results, "newfailed"), "w") as ffile:
-            ffile.write(json.dumps(FAILED))
-
-    # Exit
-    outcode = 0
-    if len(FAILED) == 0:
-        print("ALL PASSED! CONGRATULATIONS!")
-    else:
-        outcode = 1
-
-    # Stats
-    end = time.time()
-    print()
-    print()
-    print(
-        "Ran %d tests in %f seconds, of which %d failed"
-        % (len(workers), (end - start), len(FAILED))
-    )
-
-    if outcode == 0 and args.with_coverage:
-        do_show_coverage(args)
-
-    return outcode
-
-
-def do_list(args):
-    """ List tests that failed the last/specified run.
-    """
-
-    # Some pre-flight checks
-    if not os.path.exists("./.git") or not os.path.exists("./pagure"):
-        print("Please run from a single level into the Pagure codebase")
-        return 1
-
-    if not os.path.exists(args.results):
-        print(
-            "Could not find an existing results folder at: %s" % args.results
-        )
-        return 1
-
-    if not os.path.exists(os.path.join(args.results, "newfailed")):
-        print(
-            "Could not find an failed tests in the results folder at: %s"
-            % args.results
-        )
-        return 1
-
-    print("Pre-flight checks passed")
-
-    suites = []
-    tmp = []
-
-    print("Loading failed tests")
-    try:
-        with open(os.path.join(args.results, "newfailed"), "r") as ffile:
-            suites = json.loads(ffile.read())
-    except json.decoder.JSONDecodeError:
-        print("File containing the failed tests is not JSON")
-        return 1
-
-    print("Failed tests")
-    failed_tests = len(suites)
-
-    if args.n:
-        suites = suites[: args.n]
-    print("- " + "\n- ".join(suites))
-    print("Total: %s test failed" % failed_tests)
-
-    if args.show:
-        for suite in suites:
-            cmd = ["less", os.path.join(args.results, suite)]
-            subprocess.check_call(cmd)
-
-
-def do_show_coverage(args):
-    print()
-    print("Combining coverage results...")
-
-    pyvers = _get_pyvers(args)
-
-    for pyver in pyvers:
-        coverfiles = []
-        for fname in os.listdir(args.results):
-            if fname.endswith(".coverage") and fname.startswith(
-                "py%s-" % pyver
-            ):
-                coverfiles.append(os.path.join(args.results, fname))
-
-        cover = None
-        if pyver == 2:
-            cover = COVER_PY2
-        elif pyver == 3:
-            cover = COVER_PY3
-        else:
-            cover = COVER_PY
-
-        env = {
-            "COVERAGE_FILE": os.path.join(args.results, "combined.coverage")
-        }
-        cmd = [cover, "combine"] + coverfiles
-        subprocess.check_call(cmd, env=env)
-        print()
-        print("Python %s coverage: " % pyver)
-        cmd = [cover, "report", "--include=./pagure/*", "-m"]
-        subprocess.check_call(cmd, env=env)
-
-
-def main():
-    """ Main function """
-    # Set up parser for global args
-    parser = setup_parser()
-    # Parse the commandline
-    try:
-        arg = parser.parse_args()
-    except argparse.ArgumentTypeError as err:
-        print("\nError: {0}".format(err))
-        return 2
-
-    logging.basicConfig()
-    if arg.debug:
-        LOG.setLevel(logging.DEBUG)
-
-    if "func" not in arg:
-        parser.print_help()
-        return 1
-
-    arg.results = os.path.abspath(arg.results)
-
-    return_code = 0
-
-    try:
-        return_code = arg.func(arg)
-    except KeyboardInterrupt:
-        print("\nInterrupted by user.")
-        return_code = 1
-    except Exception as err:
-        print("Error: {0}".format(err))
-        logging.exception("Generic error caught:")
-        return_code = 5
-
-    return return_code
-
-
-if __name__ == "__main__":
-    sys.exit(main())

+ 0 - 41
utils/perfplugin.py

@@ -1,41 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
- (c) 2017 - Copyright Red Hat Inc
-
- Authors:
-   Patrick Uiterwijk <puiterwijk@redhat.com>
-
-"""
-
-from __future__ import unicode_literals, absolute_import
-
-import logging
-import os
-
-from nose.plugins import Plugin
-
-import perfrepo
-
-log = logging.getLogger("nose.plugins.perfplugin")
-
-
-class PerfPlugin(Plugin):
-    """A plugin for Nose that reports back on the test performance."""
-
-    name = "pagureperf"
-
-    def options(self, parser, env=None):
-        if env is None:
-            env = os.environ
-        super(PerfPlugin, self).options(parser, env=env)
-
-    def configure(self, options, conf):
-        super(PerfPlugin, self).configure(options, conf)
-        if not self.enabled:
-            return
-
-    def report(self, stream):
-        stream.write("GIT PERFORMANCE TOTALS:\n")
-        stream.write("\tWalks: %d\n" % perfrepo.TOTALS["walks"])
-        stream.write("\tSteps: %d\n" % perfrepo.TOTALS["steps"])