blob: ad6ca83598efb7d9b40d9c74e420fecb8f8c6b9e [file] [log] [blame]
% 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)