% Import tests ~ not_pypy + Import tests ~ imports = Prepare importing all scapy files import os import glob import subprocess import re import time import sys from scapy.consts import WINDOWS, OPENBSD # DEV: to add your file to this list, make sure you have # a GREAT reason. EXCEPTIONS = [ "scapy.__main__", "scapy.all", "scapy.contrib.automotive*", "scapy.contrib.cansocket*", "scapy.contrib.isotp*", "scapy.contrib.scada*", "scapy.layers.all", "scapy.main", ] if WINDOWS: EXCEPTIONS.append("scapy.layers.tuntap") EXCEPTION_PACKAGES = [ "arch", "libs", "modules", "tools", ] ALL_FILES = [ "scapy." + re.match(".*scapy\\" + os.path.sep + "(.*)\\.py$", x).group(1).replace(os.path.sep, ".") for x in glob.iglob(scapy_path('/scapy/**/*.py'), recursive=True) ] ALL_FILES = [ x for x in ALL_FILES if not any(x == y if y[-1] != "*" else x.startswith(y[:-1]) for y in EXCEPTIONS) and x.split(".")[1] not in EXCEPTION_PACKAGES ] NB_PROC = 1 if WINDOWS or OPENBSD else 4 def append_processes(processes, filename): processes.append( (subprocess.Popen( [sys.executable, "-c", "import %s" % filename], stderr=subprocess.PIPE, encoding="utf8"), time.time(), filename)) def check_processes(processes): for i, tup in enumerate(processes): proc, start_ts, file = tup errs = "" try: _, errs = proc.communicate(timeout=0.5) except subprocess.TimeoutExpired: if time.time() - start_ts > 30: proc.kill() errs = "Timed out (>30s)!" if proc.returncode is None: continue else: print("Finished %s with %d after %f sec" % (file, proc.returncode, time.time() - start_ts)) if proc.returncode != 0: for p in processes: p[0].kill() raise Exception( "Importing the file '%s' failed !\\n%s" % (file, errs)) del processes[i] return def import_all(FILES): processes = list() while len(processes) == NB_PROC: check_processes(processes) for filename in FILES: check_processes(processes) if len(processes) < NB_PROC: append_processes(processes, filename) = Try importing all core separately import_all(x for x in ALL_FILES if "layers" not in x and "contrib" not in x) = Try importing all layers separately import_all(x for x in ALL_FILES if "layers" in x) = Try importing all contribs separately import_all(x for x in ALL_FILES if "contrib" in x)