diff options
Diffstat (limited to 'testing')
24 files changed, 116 insertions, 73 deletions
diff --git a/testing/marionette/harness/marionette_harness/marionette_test/testcases.py b/testing/marionette/harness/marionette_harness/marionette_test/testcases.py index 32c36967bb..84a6e09665 100644 --- a/testing/marionette/harness/marionette_harness/marionette_test/testcases.py +++ b/testing/marionette/harness/marionette_harness/marionette_test/testcases.py @@ -2,7 +2,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -import imp + import os import re import sys @@ -14,6 +14,7 @@ from unittest.case import SkipTest import six from marionette_driver.errors import TimeoutException, UnresponsiveInstanceException +from mozfile import load_source from mozlog import get_default_logger @@ -365,21 +366,20 @@ class MarionetteTestCase(CommonTestCase): testvars, **kwargs ): - # since we use imp.load_source to load test modules, if a module - # is loaded with the same name as another one the module would just be - # reloaded. + # since load_source caches modules, if a module is loaded with the same + # name as another one the module would just be reloaded. # - # We may end up by finding too many test in a module then since - # reload() only update the module dict (so old keys are still there!) - # see https://docs.python.org/2/library/functions.html#reload + # We may end up by finding too many test in a module then since reload() + # only update the module dict (so old keys are still there!) see + # https://docs.python.org/2/library/functions.html#reload # - # we get rid of that by removing the module from sys.modules, - # so we ensure that it will be fully loaded by the - # imp.load_source call. + # we get rid of that by removing the module from sys.modules, so we + # ensure that it will be fully loaded by the imp.load_source call. + if mod_name in sys.modules: del sys.modules[mod_name] - test_mod = imp.load_source(mod_name, filepath) + test_mod = load_source(mod_name, filepath) for name in dir(test_mod): obj = getattr(test_mod, name) diff --git a/testing/mochitest/mach_commands.py b/testing/mochitest/mach_commands.py index c1f0c0cfa9..74730a98bd 100644 --- a/testing/mochitest/mach_commands.py +++ b/testing/mochitest/mach_commands.py @@ -14,6 +14,7 @@ import six from mach.decorators import Command, CommandArgument from mozbuild.base import MachCommandConditions as conditions from mozbuild.base import MozbuildObject +from mozfile import load_source here = os.path.abspath(os.path.dirname(__file__)) @@ -90,11 +91,8 @@ class MochitestRunner(MozbuildObject): """Runs a mochitest.""" # runtests.py is ambiguous, so we load the file/module manually. if "mochitest" not in sys.modules: - import imp - path = os.path.join(self.mochitest_dir, "runtests.py") - with open(path, "r") as fh: - imp.load_module("mochitest", fh, path, (".py", "r", imp.PY_SOURCE)) + load_source("mochitest", path) import mochitest @@ -145,11 +143,9 @@ class MochitestRunner(MozbuildObject): if host_ret != 0: return host_ret - import imp - path = os.path.join(self.mochitest_dir, "runtestsremote.py") - with open(path, "r") as fh: - imp.load_module("runtestsremote", fh, path, (".py", "r", imp.PY_SOURCE)) + load_source("runtestsremote", path) + import runtestsremote options = Namespace(**kwargs) @@ -195,14 +191,11 @@ def setup_argument_parser(): with warnings.catch_warnings(): warnings.simplefilter("ignore") - import imp - path = os.path.join(build_obj.topobjdir, mochitest_dir, "runtests.py") if not os.path.exists(path): path = os.path.join(here, "runtests.py") - with open(path, "r") as fh: - imp.load_module("mochitest", fh, path, (".py", "r", imp.PY_SOURCE)) + load_source("mochitest", path) from mochitest_options import MochitestArgumentParser @@ -237,14 +230,11 @@ def setup_junit_argument_parser(): warnings.simplefilter("ignore") # runtests.py contains MochitestDesktop, required by runjunit - import imp - path = os.path.join(build_obj.topobjdir, mochitest_dir, "runtests.py") if not os.path.exists(path): path = os.path.join(here, "runtests.py") - with open(path, "r") as fh: - imp.load_module("mochitest", fh, path, (".py", "r", imp.PY_SOURCE)) + load_source("mochitest", path) import runjunit from mozrunner.devices.android_device import ( diff --git a/testing/mozbase/mozfile/mozfile/mozfile.py b/testing/mozbase/mozfile/mozfile/mozfile.py index 1f4ffa74af..20d56fe4b2 100644 --- a/testing/mozbase/mozfile/mozfile/mozfile.py +++ b/testing/mozbase/mozfile/mozfile/mozfile.py @@ -22,6 +22,7 @@ __all__ = [ "extract", "is_url", "load", + "load_source", "copy_contents", "match", "move", @@ -629,6 +630,19 @@ def load(resource): return urllib.request.urlopen(resource) +# see https://docs.python.org/3/whatsnew/3.12.html#imp +def load_source(modname, filename): + import importlib.machinery + import importlib.util + + loader = importlib.machinery.SourceFileLoader(modname, filename) + spec = importlib.util.spec_from_file_location(modname, filename, loader=loader) + module = importlib.util.module_from_spec(spec) + sys.modules[module.__name__] = module + loader.exec_module(module) + return module + + # We can't depend on mozpack.path here, so copy the 'match' function over. re_cache = {} diff --git a/testing/mozbase/mozprofile/mozprofile/prefs.py b/testing/mozbase/mozprofile/mozprofile/prefs.py index 6c3b1173c8..b84d531f23 100644 --- a/testing/mozbase/mozprofile/mozprofile/prefs.py +++ b/testing/mozbase/mozprofile/mozprofile/prefs.py @@ -12,7 +12,15 @@ import tokenize import mozfile import six from six import StringIO, string_types -from six.moves.configparser import SafeConfigParser as ConfigParser + +try: + from six.moves.configparser import SafeConfigParser as ConfigParser +except ImportError: # SafeConfigParser was removed in 3.12 + from configparser import ConfigParser +try: + ConfigParser.read_file +except AttributeError: # read_file was added in 3.2, readfp removed in 3.12 + ConfigParser.read_file = ConfigParser.readfp if six.PY3: @@ -24,7 +32,7 @@ __all__ = ("PreferencesReadError", "Preferences") class PreferencesReadError(Exception): - """read error for prefrences files""" + """read error for preferences files""" class Preferences(object): @@ -124,7 +132,7 @@ class Preferences(object): parser = ConfigParser() parser.optionxform = str - parser.readfp(mozfile.load(path)) + parser.read_file(mozfile.load(path)) if section: if section not in parser.sections(): diff --git a/testing/mozharness/scripts/desktop_unittest.py b/testing/mozharness/scripts/desktop_unittest.py index 336f2c752b..b2bf44c2b2 100755 --- a/testing/mozharness/scripts/desktop_unittest.py +++ b/testing/mozharness/scripts/desktop_unittest.py @@ -12,7 +12,6 @@ author: Jordan Lund import copy import glob -import imp import json import multiprocessing import os @@ -25,6 +24,7 @@ from datetime import datetime, timedelta here = os.path.abspath(os.path.dirname(__file__)) sys.path.insert(1, os.path.dirname(here)) +from mozfile import load_source from mozharness.base.errors import BaseErrorList from mozharness.base.log import INFO, WARNING from mozharness.base.script import PreScriptAction @@ -1167,7 +1167,7 @@ class DesktopUnittest(TestingMixin, MercurialScript, MozbaseMixin, CodeCoverageM ) if suite_category == "reftest": - ref_formatter = imp.load_source( + ref_formatter = load_source( "ReftestFormatter", os.path.abspath( os.path.join(dirs["abs_reftest_dir"], "output.py") diff --git a/testing/raptor/mach_commands.py b/testing/raptor/mach_commands.py index bb9e6b73f5..c076bbbf79 100644 --- a/testing/raptor/mach_commands.py +++ b/testing/raptor/mach_commands.py @@ -269,10 +269,10 @@ class RaptorRunner(MozbuildObject): def setup_node(command_context): """Fetch the latest node-16 binary and install it into the .mozbuild directory.""" import platform - from distutils.version import StrictVersion from mozbuild.artifact_commands import artifact_toolchain from mozbuild.nodeutil import find_node_executable + from packaging.version import Version print("Setting up node for browsertime...") state_dir = get_state_dir() @@ -280,7 +280,7 @@ def setup_node(command_context): def __check_for_node(): # Check standard locations first - node_exe = find_node_executable(min_version=StrictVersion("16.0.0")) + node_exe = find_node_executable(min_version=Version("16.0.0")) if node_exe and (node_exe[0] is not None): return node_exe[0] if not os.path.exists(cache_path): diff --git a/testing/web-platform/manifestupdate.py b/testing/web-platform/manifestupdate.py index 79b7f1ae56..f8f9d08cb9 100644 --- a/testing/web-platform/manifestupdate.py +++ b/testing/web-platform/manifestupdate.py @@ -5,13 +5,13 @@ import argparse import errno import hashlib -import imp import os import sys import manifestdownload import six from mach.util import get_state_dir +from mozfile import load_source from mozlog.structured import commandline from six.moves import configparser from wptrunner import wptcommandline @@ -21,9 +21,7 @@ manifest = None def do_delayed_imports(wpt_dir): global manifest - imp.load_source( - "localpaths", os.path.join(wpt_dir, "tests", "tools", "localpaths.py") - ) + load_source("localpaths", os.path.join(wpt_dir, "tests", "tools", "localpaths.py")) sys.path.insert(0, os.path.join(wpt_dir, "tools", "manifest")) import manifest diff --git a/testing/web-platform/tests/service-workers/service-worker/resources/scope1/redirect.py b/testing/web-platform/tests/service-workers/service-worker/resources/scope1/redirect.py index bb4c874aac..025ea671c5 100644 --- a/testing/web-platform/tests/service-workers/service-worker/resources/scope1/redirect.py +++ b/testing/web-platform/tests/service-workers/service-worker/resources/scope1/redirect.py @@ -1,6 +1,8 @@ import os -import imp + +from tools.wpt.utils import load_source + # Use the file from the parent directory. -mod = imp.load_source("_parent", os.path.join(os.path.dirname(os.path.dirname(__file__)), +mod = load_source("_parent", os.path.join(os.path.dirname(os.path.dirname(__file__)), os.path.basename(__file__))) main = mod.main diff --git a/testing/web-platform/tests/service-workers/service-worker/resources/scope2/worker_interception_redirect_webworker.py b/testing/web-platform/tests/service-workers/service-worker/resources/scope2/worker_interception_redirect_webworker.py index bb4c874aac..025ea671c5 100644 --- a/testing/web-platform/tests/service-workers/service-worker/resources/scope2/worker_interception_redirect_webworker.py +++ b/testing/web-platform/tests/service-workers/service-worker/resources/scope2/worker_interception_redirect_webworker.py @@ -1,6 +1,8 @@ import os -import imp + +from tools.wpt.utils import load_source + # Use the file from the parent directory. -mod = imp.load_source("_parent", os.path.join(os.path.dirname(os.path.dirname(__file__)), +mod = load_source("_parent", os.path.join(os.path.dirname(os.path.dirname(__file__)), os.path.basename(__file__))) main = mod.main diff --git a/testing/web-platform/tests/service-workers/service-worker/resources/subdir/worker_interception_redirect_webworker.py b/testing/web-platform/tests/service-workers/service-worker/resources/subdir/worker_interception_redirect_webworker.py index bb4c874aac..025ea671c5 100644 --- a/testing/web-platform/tests/service-workers/service-worker/resources/subdir/worker_interception_redirect_webworker.py +++ b/testing/web-platform/tests/service-workers/service-worker/resources/subdir/worker_interception_redirect_webworker.py @@ -1,6 +1,8 @@ import os -import imp + +from tools.wpt.utils import load_source + # Use the file from the parent directory. -mod = imp.load_source("_parent", os.path.join(os.path.dirname(os.path.dirname(__file__)), +mod = load_source("_parent", os.path.join(os.path.dirname(os.path.dirname(__file__)), os.path.basename(__file__))) main = mod.main diff --git a/testing/web-platform/tests/tools/runner/update_manifest.py b/testing/web-platform/tests/tools/runner/update_manifest.py index a7f72b35b3..58b9ac4d84 100644 --- a/testing/web-platform/tests/tools/runner/update_manifest.py +++ b/testing/web-platform/tests/tools/runner/update_manifest.py @@ -1,16 +1,18 @@ # mypy: ignore-errors -import imp import json import os +from tools.wpt.utils import load_source + here = os.path.dirname(__file__) -localpaths = imp.load_source("localpaths", os.path.abspath(os.path.join(here, os.pardir, "localpaths.py"))) +localpaths = load_source("localpaths", os.path.abspath(os.path.join(here, os.pardir, "localpaths.py"))) root = localpaths.repo_root from manifest import manifest + def main(request, response): path = os.path.join(root, "MANIFEST.json") diff --git a/testing/web-platform/tests/tools/wpt/utils.py b/testing/web-platform/tests/tools/wpt/utils.py index b015b95e1a..5899dc3f3a 100644 --- a/testing/web-platform/tests/tools/wpt/utils.py +++ b/testing/web-platform/tests/tools/wpt/utils.py @@ -3,10 +3,10 @@ import errno import logging import os -import sys import shutil import stat import subprocess +import sys import tarfile import time import zipfile @@ -166,3 +166,16 @@ def sha256sum(file_path): for chunk in iter(lambda: f.read(4096), b''): hash.update(chunk) return hash.hexdigest() + + +# see https://docs.python.org/3/whatsnew/3.12.html#imp +def load_source(modname, filename): + import importlib.machinery + import importlib.util + + loader = importlib.machinery.SourceFileLoader(modname, filename) + spec = importlib.util.spec_from_file_location(modname, filename, loader=loader) + module = importlib.util.module_from_spec(spec) + sys.modules[module.__name__] = module + loader.exec_module(module) + return module diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/stability.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/stability.py index 9ac6249c44..1f17ef3c47 100644 --- a/testing/web-platform/tests/tools/wptrunner/wptrunner/stability.py +++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/stability.py @@ -2,7 +2,6 @@ import copy import functools -import imp import io import os from collections import OrderedDict, defaultdict @@ -10,16 +9,17 @@ from datetime import datetime from mozlog import reader from mozlog.formatters import JSONFormatter -from mozlog.handlers import BaseHandler, StreamHandler, LogLevelFilter +from mozlog.handlers import BaseHandler, LogLevelFilter, StreamHandler + +from tools.wpt.utils import load_source from . import wptrunner here = os.path.dirname(__file__) -localpaths = imp.load_source("localpaths", os.path.abspath(os.path.join(here, os.pardir, os.pardir, "localpaths.py"))) +localpaths = load_source("localpaths", os.path.abspath(os.path.join(here, os.pardir, os.pardir, "localpaths.py"))) from ci.tc.github_checks_output import get_gh_checks_outputter # type: ignore from wpt.markdown import markdown_adjust, table # type: ignore - # If a test takes more than (FLAKY_THRESHOLD*timeout) and does not consistently # time out, it is considered slow (potentially flaky). FLAKY_THRESHOLD = 0.8 diff --git a/testing/web-platform/tests/xhr/resources/auth1/auth.py b/testing/web-platform/tests/xhr/resources/auth1/auth.py index db4f7bc4c9..3797aaa52e 100644 --- a/testing/web-platform/tests/xhr/resources/auth1/auth.py +++ b/testing/web-platform/tests/xhr/resources/auth1/auth.py @@ -1,12 +1,13 @@ -import imp import os from wptserve.utils import isomorphic_decode +from tools.wpt.utils import load_source + here = os.path.dirname(os.path.abspath(isomorphic_decode(__file__))) def main(request, response): - auth = imp.load_source(u"", os.path.join(here, + auth = load_source(u"", os.path.join(here, u"..", u"authentication.py")) return auth.main(request, response) diff --git a/testing/web-platform/tests/xhr/resources/auth10/auth.py b/testing/web-platform/tests/xhr/resources/auth10/auth.py index db4f7bc4c9..568d31e906 100644 --- a/testing/web-platform/tests/xhr/resources/auth10/auth.py +++ b/testing/web-platform/tests/xhr/resources/auth10/auth.py @@ -1,12 +1,14 @@ -import imp import os from wptserve.utils import isomorphic_decode +from tools.wpt.utils import load_source + here = os.path.dirname(os.path.abspath(isomorphic_decode(__file__))) + def main(request, response): - auth = imp.load_source(u"", os.path.join(here, + auth = load_source(u"", os.path.join(here, u"..", u"authentication.py")) return auth.main(request, response) diff --git a/testing/web-platform/tests/xhr/resources/auth11/auth.py b/testing/web-platform/tests/xhr/resources/auth11/auth.py index db4f7bc4c9..3797aaa52e 100644 --- a/testing/web-platform/tests/xhr/resources/auth11/auth.py +++ b/testing/web-platform/tests/xhr/resources/auth11/auth.py @@ -1,12 +1,13 @@ -import imp import os from wptserve.utils import isomorphic_decode +from tools.wpt.utils import load_source + here = os.path.dirname(os.path.abspath(isomorphic_decode(__file__))) def main(request, response): - auth = imp.load_source(u"", os.path.join(here, + auth = load_source(u"", os.path.join(here, u"..", u"authentication.py")) return auth.main(request, response) diff --git a/testing/web-platform/tests/xhr/resources/auth2/auth.py b/testing/web-platform/tests/xhr/resources/auth2/auth.py index db4f7bc4c9..568d31e906 100644 --- a/testing/web-platform/tests/xhr/resources/auth2/auth.py +++ b/testing/web-platform/tests/xhr/resources/auth2/auth.py @@ -1,12 +1,14 @@ -import imp import os from wptserve.utils import isomorphic_decode +from tools.wpt.utils import load_source + here = os.path.dirname(os.path.abspath(isomorphic_decode(__file__))) + def main(request, response): - auth = imp.load_source(u"", os.path.join(here, + auth = load_source(u"", os.path.join(here, u"..", u"authentication.py")) return auth.main(request, response) diff --git a/testing/web-platform/tests/xhr/resources/auth2/corsenabled.py b/testing/web-platform/tests/xhr/resources/auth2/corsenabled.py index bec6687dbe..7b9d3b65ab 100644 --- a/testing/web-platform/tests/xhr/resources/auth2/corsenabled.py +++ b/testing/web-platform/tests/xhr/resources/auth2/corsenabled.py @@ -1,8 +1,9 @@ -import imp import os from wptserve.utils import isomorphic_decode +from tools.wpt.utils import load_source + here = os.path.dirname(isomorphic_decode(__file__)) def main(request, response): @@ -11,7 +12,7 @@ def main(request, response): response.headers.set(b'Access-Control-Allow-Methods', b'GET') response.headers.set(b'Access-Control-Allow-Headers', b'authorization, x-user, x-pass') response.headers.set(b'Access-Control-Expose-Headers', b'x-challenge, xhr-user, ses-user') - auth = imp.load_source(u"", os.path.abspath(os.path.join(here, os.pardir, u"authentication.py"))) + auth = load_source(u"", os.path.abspath(os.path.join(here, os.pardir, u"authentication.py"))) if request.method == u"OPTIONS": return b"" else: diff --git a/testing/web-platform/tests/xhr/resources/auth3/auth.py b/testing/web-platform/tests/xhr/resources/auth3/auth.py index db4f7bc4c9..3797aaa52e 100644 --- a/testing/web-platform/tests/xhr/resources/auth3/auth.py +++ b/testing/web-platform/tests/xhr/resources/auth3/auth.py @@ -1,12 +1,13 @@ -import imp import os from wptserve.utils import isomorphic_decode +from tools.wpt.utils import load_source + here = os.path.dirname(os.path.abspath(isomorphic_decode(__file__))) def main(request, response): - auth = imp.load_source(u"", os.path.join(here, + auth = load_source(u"", os.path.join(here, u"..", u"authentication.py")) return auth.main(request, response) diff --git a/testing/web-platform/tests/xhr/resources/auth4/auth.py b/testing/web-platform/tests/xhr/resources/auth4/auth.py index db4f7bc4c9..3797aaa52e 100644 --- a/testing/web-platform/tests/xhr/resources/auth4/auth.py +++ b/testing/web-platform/tests/xhr/resources/auth4/auth.py @@ -1,12 +1,13 @@ -import imp import os from wptserve.utils import isomorphic_decode +from tools.wpt.utils import load_source + here = os.path.dirname(os.path.abspath(isomorphic_decode(__file__))) def main(request, response): - auth = imp.load_source(u"", os.path.join(here, + auth = load_source(u"", os.path.join(here, u"..", u"authentication.py")) return auth.main(request, response) diff --git a/testing/web-platform/tests/xhr/resources/auth7/corsenabled.py b/testing/web-platform/tests/xhr/resources/auth7/corsenabled.py index 7a060627b7..c82ba4e6bc 100644 --- a/testing/web-platform/tests/xhr/resources/auth7/corsenabled.py +++ b/testing/web-platform/tests/xhr/resources/auth7/corsenabled.py @@ -1,8 +1,9 @@ -import imp import os from wptserve.utils import isomorphic_decode +from tools.wpt.utils import load_source + here = os.path.dirname(isomorphic_decode(__file__)) def main(request, response): @@ -11,7 +12,7 @@ def main(request, response): response.headers.set(b'Access-Control-Allow-Methods', b'GET') response.headers.set(b'Access-Control-Allow-Headers', b'authorization, x-user, x-pass') response.headers.set(b'Access-Control-Expose-Headers', b'x-challenge, xhr-user, ses-user') - auth = imp.load_source(u"", os.path.join(here, + auth = load_source(u"", os.path.join(here, os.pardir, u"authentication.py")) if request.method == u"OPTIONS": diff --git a/testing/web-platform/tests/xhr/resources/auth8/corsenabled-no-authorize.py b/testing/web-platform/tests/xhr/resources/auth8/corsenabled-no-authorize.py index af8e7c4c17..4fdf99e265 100644 --- a/testing/web-platform/tests/xhr/resources/auth8/corsenabled-no-authorize.py +++ b/testing/web-platform/tests/xhr/resources/auth8/corsenabled-no-authorize.py @@ -1,8 +1,9 @@ -import imp import os from wptserve.utils import isomorphic_decode +from tools.wpt.utils import load_source + here = os.path.dirname(isomorphic_decode(__file__)) def main(request, response): @@ -11,7 +12,7 @@ def main(request, response): response.headers.set(b'Access-Control-Allow-Methods', b'GET') response.headers.set(b'Access-Control-Allow-Headers', b'x-user, x-pass') response.headers.set(b'Access-Control-Expose-Headers', b'x-challenge, xhr-user, ses-user') - auth = imp.load_source(u"", os.path.join(here, + auth = load_source(u"", os.path.join(here, os.pardir, u"authentication.py")) if request.method == u"OPTIONS": diff --git a/testing/web-platform/tests/xhr/resources/auth9/auth.py b/testing/web-platform/tests/xhr/resources/auth9/auth.py index db4f7bc4c9..3797aaa52e 100644 --- a/testing/web-platform/tests/xhr/resources/auth9/auth.py +++ b/testing/web-platform/tests/xhr/resources/auth9/auth.py @@ -1,12 +1,13 @@ -import imp import os from wptserve.utils import isomorphic_decode +from tools.wpt.utils import load_source + here = os.path.dirname(os.path.abspath(isomorphic_decode(__file__))) def main(request, response): - auth = imp.load_source(u"", os.path.join(here, + auth = load_source(u"", os.path.join(here, u"..", u"authentication.py")) return auth.main(request, response) diff --git a/testing/web-platform/update/__init__.py b/testing/web-platform/update/__init__.py index 47c6d36d95..66bb6f2ab6 100644 --- a/testing/web-platform/update/__init__.py +++ b/testing/web-platform/update/__init__.py @@ -4,15 +4,15 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -import imp import os import sys +from mozfile import load_source from mozlog import structuredlog here = os.path.split(__file__)[0] -imp.load_source( +load_source( "localpaths", os.path.join(here, os.pardir, "tests", "tools", "localpaths.py") ) |