import argparse
import os
import psutil
-import textwrap
import time
+from vpp_qemu_utils import can_create_namespaces
def positive_int_or_default(default):
def positive_integer(v):
- if v is None or v == "":
+ if v is None or v == "" or int(v) == default:
return default
if int(v) <= 0:
raise ValueError("value must be positive")
def positive_float_or_default(default):
def positive_float(v):
- if v is None or v == "":
+ if v is None or v == "" or float(v) == default:
return default
if float(v) <= 0:
raise ValueError("value must be positive")
"--failed-dir",
action="store",
type=directory,
- help="directory containing failed tests",
+ help="directory containing failed tests (default: --tmp-dir)",
)
filter_help_string = """\
-expression consists of 3 string selectors separated by '.' separators:
+expression consists of one or more filters separated by commas (',')
+filter consists of 3 string selectors separated by dots ('.')
<file>.<class>.<function>
test_add_bfd from test_bfd.py/BFDAPITestCase
4. '.*.test_add_bfd' selects all test functions named test_add_bfd
from all files/classes
+5. 'bfd,ip4,..test_icmp_error' selects all test functions in test_bfd.py,
+ test_ip4.py and all test functions named 'test_icmp_error' in all files
"""
parser.add_argument(
"--filter", action="store", metavar="FILTER_EXPRESSION", help=filter_help_string
)
parser.add_argument("--extended", action="store_true", help="run extended tests")
+parser.add_argument(
+ "--skip-netns-tests",
+ action="store_true",
+ help="skip tests involving netns operations",
+)
parser.add_argument(
"--sanity", action="store_true", help="perform sanity vpp run before running tests"
)
+parser.add_argument("--api-preload", action="store_true", help="preload API files")
parser.add_argument(
"--force-foreground",
help="directory containing external plugins",
)
+parser.add_argument(
+ "--extern-apidir",
+ action="append",
+ type=directory,
+ default=[],
+ help="directory to look for API JSON files",
+)
+
parser.add_argument(
"--coredump-size",
action="store",
"--keep-pcaps",
action="store_true",
default=default_keep_pcaps,
- help="if set, keep all pcap files from a test run"
- f" (default: {default_keep_pcaps})",
+ help=f"if set, keep all pcap files from a test run (default: {default_keep_pcaps})",
+)
+
+parser.add_argument(
+ "-r",
+ "--use-running-vpp",
+ dest="running_vpp",
+ required=False,
+ action="store_true",
+ default=False,
+ help="Runs tests against a running VPP.",
+)
+
+parser.add_argument(
+ "--excluded-plugin",
+ dest="excluded_plugins",
+ required=False,
+ action="append",
+ default=[],
+ help="Exclude the tests that indicate they require this plugin(s)",
+)
+
+parser.add_argument(
+ "-d",
+ "--socket-dir",
+ dest="socket_dir",
+ required=False,
+ action="store",
+ default="",
+ help="Relative or absolute path to running VPP's socket directory.\n"
+ "The directory must contain VPP's socket files:api.sock & stats.sock.\n"
+ "Default: /var/run/vpp if VPP is started as the root user, else "
+ "/var/run/user/${uid}/vpp.",
+)
+
+default_decode_pcaps = False
+parser.add_argument(
+ "--decode-pcaps",
+ action="store_true",
+ default=default_decode_pcaps,
+ help=f"if set, decode all pcap files from a test run (default: {default_decode_pcaps})",
)
config = parser.parse_args()
if config.venv_dir is None:
- config.venv_dir = f"{ws}/test/venv"
+ config.venv_dir = f"{ws}/build-root/test/venv"
+
+if config.failed_dir is None:
+ config.failed_dir = f"{config.tmp_dir}"
available_cpus = psutil.Process().cpu_affinity()
num_cpus = len(available_cpus)
else:
max_vpp_cpus = num_cpus
+if not config.skip_netns_tests:
+ if not can_create_namespaces():
+ config.skip_netns_tests = True
+
if __name__ == "__main__":
print("Provided arguments:")
for i in config.__dict__: