Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions libkirk/framework.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,10 @@
Suite,
Test,
)
from libkirk.plugin import Plugin
from libkirk.results import TestResults


class Framework(Plugin):
class Framework:
"""
Framework definition. Implement this class if you need to support more
testing frameworks inside the application.
Expand Down
63 changes: 24 additions & 39 deletions libkirk/ltp.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
Optional,
)

import libkirk.types
from libkirk.com import ComChannel
from libkirk.data import (
Suite,
Expand Down Expand Up @@ -47,56 +46,42 @@ class LTPFramework(Framework):
"max_runtime",
]

_name = "ltp"

def __init__(self) -> None:
def __init__(
self,
max_runtime: float = 0.0,
timeout: float = 30.0,
env: dict = {},
) -> None:
"""
:param max_runtime: filter out all tests above this time value
:type max_runtime: float
:param timeout: generic tests timeout
:type timeout: float
:param env: user environment variables
:type env: dict
"""
self._logger = logging.getLogger("libkirk.ltp")
self._root = ""
self._env = {}
self._max_runtime = 0.0
self._tc_folder = ""
self._cmd_matcher = re.compile(r'(?:"[^"]*"|\'[^\']*\'|\S+)')

@property
def config_help(self) -> Dict[str, str]:
return {
"root": "LTP install folder",
"max_runtime": "filter out all tests above this time value",
}

def setup(self, **kwargs: Dict[str, Any]) -> None:
self._max_runtime = max_runtime
self._root = os.environ.get("LTPROOT", "/opt/ltp")
self._tc_folder = os.path.join(self._root, "testcases", "bin")

self._env = {
"LTPROOT": self._root,
"TMPDIR": "/tmp",
"LTP_COLORIZE_OUTPUT": "1",
}

env = libkirk.types.dict_item(kwargs, "env", dict)
multiplier = os.environ.get("LTP_TIMEOUT_MUL", None)
if multiplier:
self._env["LTP_TIMEOUT_MUL"] = multiplier
else:
if timeout:
self._env["LTP_TIMEOUT_MUL"] = str((timeout * 0.9) / 300.0)

if env:
self._env.update(env)

timeout = libkirk.types.dict_item(kwargs, "test_timeout", float)
user_timeout_mul = os.environ.get("LTP_TIMEOUT_MUL")
if timeout and not user_timeout_mul:
self._env["LTP_TIMEOUT_MUL"] = str((timeout * 0.9) / 300.0)

root = libkirk.types.dict_item(kwargs, "root", str)
if root:
self._root = root
self._env["LTPROOT"] = self._root

self._tc_folder = os.path.join(self._root, "testcases", "bin")

runtime = libkirk.types.dict_item(kwargs, "max_runtime", float)
if runtime:
try:
runtime = float(runtime)
except TypeError as err:
raise FrameworkError("max_runtime must be an integer") from err

self._max_runtime = runtime

async def _read_path(self, channel: ComChannel) -> Dict[str, str]:
"""
Read PATH and initialize it with testcases folder as well.
Expand Down
70 changes: 5 additions & 65 deletions libkirk/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,9 @@
from libkirk.com import ComChannel
from libkirk.errors import (
CommunicationError,
FrameworkError,
KirkException,
SUTError,
)
from libkirk.framework import Framework
from libkirk.monitor import JSONFileMonitor
from libkirk.session import Session
from libkirk.sut import SUT
Expand All @@ -44,9 +42,6 @@
# Maximum number of COM instances
MAX_COM_INSTANCES = 128

# runtime loaded Framework(s)
LOADED_FRAMEWORK = []

# return codes of the application
RC_OK = 0
RC_ERROR = 1
Expand Down Expand Up @@ -81,8 +76,6 @@ def _from_params_to_config(params: List[str]) -> Dict[str, str]:


def _dict_config(
opt_name: str,
plugins: Union[List[ComChannel], List[SUT]],
value: str,
) -> Dict[str, str]:
"""
Expand All @@ -107,7 +100,7 @@ def _com_config(value: str) -> Optional[Dict[str, str]]:
Return the list of channels configurations.
"""
plugins = libkirk.com.get_channels()
config = _dict_config("com", plugins, value)
config = _dict_config(value)

if "help" in config:
return config
Expand Down Expand Up @@ -231,14 +224,6 @@ def _finjection_config(value: str) -> int:
return ret


def _discover_frameworks(path: str) -> None:
"""
Discover new Framework implementations.
"""
objs = libkirk.plugin.discover(Framework, path)
LOADED_FRAMEWORK.extend(objs)


def _get_skip_tests(skip_tests: str, skip_file: str) -> str:
"""
Return the skipped tests regexp.
Expand Down Expand Up @@ -316,37 +301,6 @@ def _get_sut(
return sut


def _get_framework(
args: argparse.Namespace, parser: argparse.ArgumentParser
) -> Framework:
"""
Create and framework object.
"""
fw_config = args.framework.copy()
if args.env:
fw_config["env"] = args.env.copy()

if args.exec_timeout:
fw_config["test_timeout"] = args.exec_timeout

if args.suite_timeout:
fw_config["suite_timeout"] = args.suite_timeout

fw_name = args.framework["name"]
fw = next((f for f in LOADED_FRAMEWORK if f.name == fw_name), None)
if not fw:
parser.error(f"'{fw_name}' framework is not available")

try:
# pyrefly: ignore[missing-attribute]
fw.setup(**fw_config)
except FrameworkError as err:
parser.error(str(err))

# pyrefly: ignore[bad-return]
return fw


def _start_session(args: argparse.Namespace, parser: argparse.ArgumentParser) -> None:
"""
Start the LTP session.
Expand Down Expand Up @@ -379,15 +333,14 @@ def _start_session(args: argparse.Namespace, parser: argparse.ArgumentParser) ->
if args.com:
_init_channels(args, parser, tmpdir)

# create SUT and Framework objects
# create SUT
sut = _get_sut(args, parser, tmpdir)
framework = _get_framework(args, parser)

# start session
session = Session(
sut=sut,
framework=framework,
tmpdir=tmpdir,
sut=sut,
env=args.env,
exec_timeout=args.exec_timeout,
suite_timeout=args.suite_timeout,
workers=args.workers,
Expand Down Expand Up @@ -482,8 +435,6 @@ def run(cmd_args: Optional[List[str]] = None) -> None:
libkirk.com.discover(os.path.join(currdir, "channels"))
libkirk.sut.discover(currdir)

_discover_frameworks(currdir)

parser = argparse.ArgumentParser(
description="Kirk - All-in-one Linux Testing Framework"
)
Expand Down Expand Up @@ -526,16 +477,9 @@ def run(cmd_args: Optional[List[str]] = None) -> None:
"--sut",
"-u",
default="default",
type=lambda x: _dict_config("sut", libkirk.sut.get_suts(), x),
type=lambda x: _dict_config(x),
help="System Under Test parameters. For help please use '--sut help'",
)
conf_opts.add_argument(
"--framework",
"-U",
default="ltp",
type=lambda x: _dict_config("framework", LOADED_FRAMEWORK, x),
help="Framework parameters. For help please use '--framework help'",
)
conf_opts.add_argument(
"--env",
"-e",
Expand Down Expand Up @@ -633,10 +577,6 @@ def run(cmd_args: Optional[List[str]] = None) -> None:
_print_plugin_help("--sut", libkirk.sut.get_suts())
parser.exit(RC_OK)

if args.framework and "help" in args.framework:
_print_plugin_help("--framework", LOADED_FRAMEWORK)
parser.exit(RC_OK)

if args.json_report and os.path.exists(args.json_report):
parser.error(f"JSON report file already exists: {args.json_report}")

Expand Down
13 changes: 8 additions & 5 deletions libkirk/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@
SessionError,
)
from libkirk.export import JSONExporter
from libkirk.framework import Framework
from libkirk.io import AsyncFile
from libkirk.ltp import LTPFramework
from libkirk.results import TestResults
from libkirk.scheduler import SuiteScheduler
from libkirk.sut import (
Expand Down Expand Up @@ -61,8 +61,8 @@ class Session:
def __init__(
self,
tmpdir: TempDir,
framework: Framework,
sut: SUT,
env: dict = {},
exec_timeout: float = 3600.0,
suite_timeout: float = 3600.0,
workers: int = 1,
Expand All @@ -71,8 +71,8 @@ def __init__(
"""
:param tmpdir: Temporary directory.
:type tmpdir: TempDir
:param framework: Testing framework we are using.
:type framework: Framework
:param env: user environment variables
:type env: dict
:param sut: SUT communication object.
:type sut: SUT
:param exec_timeout: Test timeout.
Expand All @@ -86,14 +86,17 @@ def __init__(
"""
self._logger = logging.getLogger("kirk.session")
self._tmpdir = tmpdir
self._framework = framework
self._sut = sut
self._exec_timeout = exec_timeout
self._force_parallel = force_parallel
self._stop = False
self._exec_lock = asyncio.Lock()
self._run_lock = asyncio.Lock()
self._results = []
self._framework = LTPFramework(
timeout=self._exec_timeout,
env=env,
)

self._scheduler = SuiteScheduler(
sut=self._sut,
Expand Down
Loading