TBot Module¶
TBot¶
-
class
tbot.
TBot
(config: tbot.config.Config, testcases: dict, new: bool = True, interactive: bool = False) → None[source]¶ Main class of TBot, you usually do not need to instanciate this yourself
Parameters: - config (tbot.config.Config) – A configuration to be used
- testcases (dict) – Testcases available to this instance
- new (bool) – Whether this is a new instance that should create a noenv machine.
Always
True
unless you know what you are doing.
Variables: - config –
tbot.config.Config()
- testcases – All available testcases
- machines – All available machines
tbot.machine.machine.MachineManager()
-
boardshell
¶ The default board machine
-
call
(tcs: typing.Union[str, typing.Callable], *, fail_ok: bool = False, doc: bool = True, **kwargs: typing.Any) → typing.Any[source]¶ Call a testcase
Parameters: - tcs (str or typing.Callable) – The testcase to be called. Can either be a string or a callable
- fail_ok (bool) – Whether a failure in this testcase is tolerable
- doc (bool) – Whether documentation should be generated in this testcase
- kwargs (dict) – Additional arguments for the testcase
Returns: The return value from the testcase
-
call_then
(tcs: typing.Union[str, typing.Callable], **kwargs: typing.Any) → typing.Callable[source]¶ Decorator to call a testcase with a function as a payload (“and_then” argument)
Parameters: - tcs (str or typing.Callable) – The testcase to call
- kwargs (dict) – Additional arguments for the testcase
Returns: The decorated function
Return type:
-
destruct
() → None[source]¶ Destruct this TBot instance and all associated machines. This method will be called automatically when exiting a with statement.
-
machine
(mach: tbot.machine.machine.Machine) → tbot.TBot[source]¶ Create a new TBot instance with a new machine
Parameters: mach (tbot.machine.machine.Machine) – The machine to be added in the new instance Returns: The new TBot instance, which has to be used inside a with statement Return type: TBot
-
shell
¶ The default host machine
Machines¶
Machine Base Class¶
-
class
tbot.machine.machine.
Machine
[source]¶ Abstract base class for machines
-
common_machine_name
¶ Common name of this machine, eg
"board"
or"labhost"
-
exec
(command: str, log_show: bool = True, log_show_stdout: bool = True) → typing.Tuple[int, str][source]¶ Execute a command on this machine
Parameters: Returns: A tuple of the return code and the output (stdout and stderr are merged)
Return type:
-
exec0
(command: str, **kwargs: bool) → str[source]¶ Execute a command and expect it to return with 0
Parameters: - command (str) – The command to be executed, no newline at the end
- kwargs – Passed through to Machine.exec
Returns: The output (stdout and stderr are merged)
Return type:
-
unique_machine_name
¶ Unique name of this machine, eg
"labhost-noenv"
-
workdir
¶ Workdir where testcases can safely store data
-
Board Machine Base Class¶
-
class
tbot.machine.board.
MachineBoard
→ None[source]¶ Abstract base class for board machines
-
common_machine_name
¶ Common name of this machine, for boards this will always be
"board"
-
exec
(command: str, log_show: bool = True, log_show_stdout: bool = True) → typing.Tuple[int, str]¶ Execute a command on this machine
Parameters: Returns: A tuple of the return code and the output (stdout and stderr are merged)
Return type:
-
exec0
(command: str, **kwargs: bool) → str¶ Execute a command and expect it to return with 0
Parameters: - command (str) – The command to be executed, no newline at the end
- kwargs – Passed through to Machine.exec
Returns: The output (stdout and stderr are merged)
Return type:
-
unique_machine_name
¶ Unique name of this machine, eg
"labhost-noenv"
-
workdir
¶ Workdir where testcases can safely store data
-
Labhost Machine Without Environment¶
-
class
tbot.machine.lab_noenv.
MachineLabNoEnv
→ None[source]¶ Labhost machine without environment
-
common_machine_name
¶ Common name of this machine, always
"host"
-
exec
(command: str, log_show: bool = True, log_show_stdout: bool = True) → typing.Tuple[int, str]¶ Execute a command on this machine
Parameters: Returns: A tuple of the return code and the output (stdout and stderr are merged)
Return type:
-
exec0
(command: str, **kwargs: bool) → str¶ Execute a command and expect it to return with 0
Parameters: - command (str) – The command to be executed, no newline at the end
- kwargs – Passed through to Machine.exec
Returns: The output (stdout and stderr are merged)
Return type:
-
unique_machine_name
¶ Unique name of this machine, always
"labhost-noenv"
-
Labhost Machine With Environment¶
-
class
tbot.machine.lab_env.
MachineLabEnv
(prompt: typing.Union[str, NoneType] = None) → None[source]¶ Labhost machine with environment
-
common_machine_name
¶ Common name of this machine, always
"host"
-
exec
(command: str, log_show: bool = True, log_show_stdout: bool = True) → typing.Tuple[int, str]¶ Execute a command on this machine
Parameters: Returns: A tuple of the return code and the output (stdout and stderr are merged)
Return type:
-
exec0
(command: str, **kwargs: bool) → str¶ Execute a command and expect it to return with 0
Parameters: - command (str) – The command to be executed, no newline at the end
- kwargs – Passed through to Machine.exec
Returns: The output (stdout and stderr are merged)
Return type:
-
unique_machine_name
¶ Unique name of this machine, always
"labhost-env"
-
Buildhost Machine¶
-
class
tbot.machine.build.
MachineBuild
(*, name: typing.Union[str, NoneType] = None, username: typing.Union[str, NoneType] = None, password: typing.Union[str, NoneType] = None, hostname: typing.Union[str, NoneType] = None, ssh_flags: typing.Union[str, NoneType] = None) → None[source]¶ Buildhost machine
Parameters: - name (str) – Name of the buildhost, as found in the config. Defaults to
the value of
tb.config["build.default"]
- username (str) – Username on the buildhost, defaults to
tb.config["build.<name>.username"]
- password (str) –
Password on the buildhost, if passwordless login is not available, defaults to
tb.config["build.<name>.password"]
Todo
Not implemented yet, you have to use passwordless login
- hostname (str) – Hostname of the buildhost, defaults to
tb.config["build.<name>.hostname"]
- ssh_flags (str) – Flags to be passed to ssh. This allows for custom
ssh options like using a different key. Defaults to
tb.config["build.<name>.ssh_flags"]
-
common_machine_name
¶ Common name of this machine, always
"host"
-
exec
(command: str, log_show: bool = True, log_show_stdout: bool = True) → typing.Tuple[int, str]¶ Execute a command on this machine
Parameters: Returns: A tuple of the return code and the output (stdout and stderr are merged)
Return type:
-
exec0
(command: str, **kwargs: bool) → str¶ Execute a command and expect it to return with 0
Parameters: - command (str) – The command to be executed, no newline at the end
- kwargs – Passed through to Machine.exec
Returns: The output (stdout and stderr are merged)
Return type:
-
unique_machine_name
¶ Unique name of this machine,
"buildhost-<name>"
- name (str) – Name of the buildhost, as found in the config. Defaults to
the value of
Board Machine For U-Boot Interaction¶
-
class
tbot.machine.board_uboot.
MachineBoardUBoot
(*, name: typing.Union[str, NoneType] = None, boardname: typing.Union[str, NoneType] = None, power_cmd_on: typing.Union[str, NoneType] = None, power_cmd_off: typing.Union[str, NoneType] = None, connect_command: typing.Union[str, NoneType] = None, autoboot_prompt: typing.Union[str, NoneType] = None, autoboot_keys: typing.Union[str, NoneType] = None, prompt: typing.Union[str, NoneType] = None) → None[source]¶ Board machine for U-Boot interaction
Parameters: - name (str) – Name of the shell (eg
someboard-uboot
), defaults totb.config["board.serial.name"]
- boardname (str) – Name of the board, defaults to
tb.config["board.name"]
- power_cmd_on (str) – Command to poweron the board, defaults to
tb.config["board.power.on_command"]
- power_cmd_off (str) – Command to poweroff the board, defaults to
tb.config["board.power.off_command"]
- connect_command (str) – Command to connect to the board with a tool that behaves similar
to rlogin, defaults to
tb.config["board.serial.command"]
- autoboot_prompt (str) – The U-Boot autoboot prompt that is expected on the board, defaults to
tb.config["uboot.shell.autoboot-prompt"]
or"Hit any key to stop autoboot: <x> "
(interpreted as a regular expression) - autoboot_keys (str) – The key sequence to stop autoboot, defaults to
tb.config["uboot.shell.autoboot-keys"]
or"\n"
- prompt (str) – The U-Boot prompt that is expected on the board, defaults to
tb.config["uboot.shell.prompt"]
or"U-Boot> "
-
common_machine_name
¶ Common name of this machine, for boards this will always be
"board"
-
exec
(command: str, log_show: bool = True, log_show_stdout: bool = True) → typing.Tuple[int, str]¶ Execute a command on this machine
Parameters: Returns: A tuple of the return code and the output (stdout and stderr are merged)
Return type:
-
exec0
(command: str, **kwargs: bool) → str¶ Execute a command and expect it to return with 0
Parameters: - command (str) – The command to be executed, no newline at the end
- kwargs – Passed through to Machine.exec
Returns: The output (stdout and stderr are merged)
Return type:
-
powercycle
() → None¶ Powercycle the board
-
unique_machine_name
¶ Unique name of this machine,
"board-uboot-<boardshell-name>"
- name (str) – Name of the shell (eg
Board Machine For Linux Interaction¶
-
class
tbot.machine.board_linux.
MachineBoardLinux
(*, name: typing.Union[str, NoneType] = None, boardname: typing.Union[str, NoneType] = None, boot_command: typing.Union[str, NoneType] = None, login_prompt: typing.Union[str, NoneType] = None, login_timeout: typing.Union[float, NoneType] = None, username: typing.Union[str, NoneType] = None, password: typing.Union[str, NoneType] = None) → None[source]¶ Board machine for Linux interaction
Parameters: - name (str) – Name of the shell (eg
someboard-bash
), defaults totb.config["linux.shell.name"]
- boardname (str) – Name of the board, defaults to
tb.config["board.name"]
- boot_command (str) – U-Boot command to boot linux. May be multiple commands
separated by newlines, defaults to
tb.config["linux.boot_command"]
- login_prompt (str) – The string to wait for before sending the username,
defaults to
tb.config["linux.shell.login_prompt"]
- login_timeout (float) – The time to wait after entering login credentials,
defaults to
tb.config["linux.shell.login_timeout"]
- username (str) – Username, defaults to
tb.config["linux.shell.username"]
- password (str) – Password, use
""
if no password is required, defaults totb.config["linux.shell.password"]
-
common_machine_name
¶ Common name of this machine, for boards this will always be
"board"
-
exec
(command: str, log_show: bool = True, log_show_stdout: bool = True) → typing.Tuple[int, str]¶ Execute a command on this machine
Parameters: Returns: A tuple of the return code and the output (stdout and stderr are merged)
Return type:
-
exec0
(command: str, **kwargs: bool) → str¶ Execute a command and expect it to return with 0
Parameters: - command (str) – The command to be executed, no newline at the end
- kwargs – Passed through to Machine.exec
Returns: The output (stdout and stderr are merged)
Return type:
-
powercycle
() → None¶ Powercycle the board
-
unique_machine_name
¶ Unique name of this machine,
"board-linux-<boardshell-name>"
- name (str) – Name of the shell (eg
Dummy Board Machine¶
-
class
tbot.machine.board_dummy.
MachineBoardDummy
(*, name: typing.Union[str, NoneType] = None, turn_on: bool = True, power_cmd_on: typing.Union[str, NoneType] = None, power_cmd_off: typing.Union[str, NoneType] = None) → None[source]¶ Board machine dummy for just turning the board on and off
Parameters: - turn_on (bool) – Whether to turn on the board or just turn it off in the end. Useful for example for the U-Boot test suite which expects the board to be off in the beginning but still needs a manual poweroff once it’s done.
- power_cmd_on (str) – The command for turning on the board, defaults to
tb.config["board.power.on_command"]
- power_cmd_off (str) – The command for turning off the board, defaults to
tb.config["board.power.off_command"]
-
common_machine_name
¶ Common name of this machine, for boards this will always be
"board"
-
exec
(command: str, log_show: bool = True, log_show_stdout: bool = True) → typing.Tuple[int, str]¶ Execute a command on this machine
Parameters: Returns: A tuple of the return code and the output (stdout and stderr are merged)
Return type:
-
exec0
(command: str, **kwargs: bool) → str¶ Execute a command and expect it to return with 0
Parameters: - command (str) – The command to be executed, no newline at the end
- kwargs – Passed through to Machine.exec
Returns: The output (stdout and stderr are merged)
Return type:
-
powercycle
() → None¶ Powercycle the board
-
unique_machine_name
¶ Unique name of this machine,
"board-dummy-<boardshell-name>"
Utils¶
Configuration¶
-
class
tbot.config.
Config
[source]¶ A TBot configuration
Access configuaration items by using a
.
separated key-path, eg:hooks = cfg["uboot.test.hooks"]
By default, this raises an exception if the value was not found. You can supply a default value that will be returned if the value was not found instead:
has_venv = cfg["uboot.test.has_venv", True]
The configuration is available as
tb.config
in all testcases.
TBot logging facilities¶
-
class
tbot.log.
LogStdoutHandler
(dct: typing.Dict[str, typing.Any], verbosity: tbot.log.Verbosity, custom_dash: typing.Union[str, NoneType]) → None[source]¶ Handler for writing to stdout and dealing with a logevent after it’s creation. You should not need to instanciate this object yourself, use
tbot.log.event()
.Variables: - dct – The log event’s dictionary, you can add additional things
- key – Key in the dictionary that output given to .print() should be appended to.
- prefix – A custom prefix that will be added in front of continuation lines.
-
tbot.log.
check_log
() → None[source]¶ Check whether the log has been initialized and throw an exception otherwise.
-
tbot.log.
debug
(msg: str) → tbot.log.LogStdoutHandler[source]¶ Print a debug message
Parameters: msg (str) – The message Returns: A handler for the created log event Return type: LogStdoutHandler
-
tbot.log.
doc
(text: str) → tbot.log.LogStdoutHandler[source]¶ Add a log event that contains text for the documentation generator.
text
should be formatted in Markdown.Parameters: text (str) – The documentation fragment Returns: A handler for the created log event Return type: LogStdoutHandler
-
tbot.log.
doc_appendix
(title: str, text: str) → tbot.log.LogStdoutHandler[source]¶ Add a log event that contains an appendix for the documentation generator.
text
should be formatted in Markdown.Parameters: Returns: A handler for the created log event
Return type:
-
tbot.log.
error
(msg: str) → tbot.log.LogStdoutHandler[source]¶ Print an error message
Parameters: msg (str) – The message Returns: A handler for the created log event Return type: LogStdoutHandler
-
tbot.log.
event
(ty: typing.List[str], *, msg: typing.Union[str, NoneType] = None, verbosity: tbot.log.Verbosity = <Verbosity.INFO: 2>, dct: typing.Union[typing.Dict[str, typing.Any], NoneType] = None, custom_dash: typing.Union[str, NoneType] = None, fake: bool = False) → tbot.log.LogStdoutHandler[source]¶ Create a new log event
Parameters: - ty (list[str]) – The type of this log event
- msg (str) – An optional message intended for being printed on the screen
- verbosity (Verbosity) – Optional verbosity of this event (defaults to
INFO
) - dct (dict) – A dictionary of payload for this logevent. Can’t contain keys
named
"type"
,"time"
,"message"
, or"verbosity"
. - custom_dash (str) – Different prefix for the message when printed onscreen
- fake (bool) – Whether this is just a fake event that won’t be logged
Returns: A handler for the created log event
Return type:
-
tbot.log.
has_color
(seq: str) → str[source]¶ Check color support and return the escape sequence for this color code if enabled.
Parameters: seq (str) – The color code, eg "1;31"
Return type: str
-
tbot.log.
has_unicode
(with_unicode: str, without_unicode: str) → str[source]¶ Check whether the terminal supports unicode, if it does, returns the
with_unicode
string, if it doesn’t, returns thewithout_unicode
string.Parameters: Return type:
-
tbot.log.
init_log
(filename: typing.Union[pathlib.Path, str], verbosity: tbot.log.Verbosity = <Verbosity.INFO: 2>) → None[source]¶ Initialize the logger
Parameters: - filename (pathlib.Path or str) – The file the log should be written to (in json format)
- verbosity (Verbosity) – The minimun verbosity for messages that are printed to stdout
-
tbot.log.
message
(msg: str, verbosity: tbot.log.Verbosity = <Verbosity.INFO: 2>) → tbot.log.LogStdoutHandler[source]¶ Print a message
Parameters: Returns: A handler for the created log event
Return type:
-
tbot.log.
oververbose
(msg: str) → tbot.log.LogStdoutHandler[source]¶ Log a “oververbose” message, this is intended for very rarely needed debug output (just run TBot with this verbosity and see for yourself …)
Will not create a new log event.
Parameters: msg (str) – The message Returns: A handler for the message Return type: LogStdoutHandler
-
tbot.log.
set_layer
(layer: int) → None[source]¶ Set the call graph depth. You should never need to call this yourself.
-
tbot.log.
warning
(msg: str) → tbot.log.LogStdoutHandler[source]¶ Print a warning message
Parameters: msg (str) – The message Returns: A handler for the created log event Return type: LogStdoutHandler
TBot log events¶
-
tbot.log_events.
exception
(name: str, trace: str) → tbot.log.LogStdoutHandler[source]¶ Log event for exceptions
Parameters: Returns: A handler for the created log event
Return type:
-
tbot.log_events.
shell_command
(*, machine: typing.List[str], command: str, show: bool, show_stdout: bool) → tbot.log.LogStdoutHandler[source]¶ Log event for the execution of shell commands
Add output of the command by calling the
print
method of the event handler. When the command is done, set the exit code.Example:
handler = tbot.log_events.shell_command( machine=["labhost", "env"], command="echo Hello World", show=True, show_stdout=True, ) # Print the output of the command handler.print("Hello World\n") # Set exit code handler.dct["exit_code"] = 0
Parameters: Returns: A handler for the created log event
Return type:
-
tbot.log_events.
tbot_done
(success: bool) → tbot.log.LogStdoutHandler[source]¶ Log event for TBot being done with running testcases
Parameters: success (bool) – Whether this run of TBot was successful Returns: A handler for the created log event Return type: LogStdoutHandler
-
tbot.log_events.
testcase_begin
(name: str) → tbot.log.LogStdoutHandler[source]¶ Log event for when a testcase is called
Parameters: name (str) – Name of the testcase Returns: A handler for the created log event Return type: LogStdoutHandler
Tescase collector¶
-
tbot.testcase_collector.
get_testcases
(paths: typing.Union[typing.List[str], typing.List[pathlib.Path], NoneType] = None) → typing.Dict[str, typing.Callable][source]¶ Collect all testcases from the directories specified in
paths
Parameters: paths – List of directories to search Returns: Collection of testcases
Utilities for shell interaction
-
tbot.machine.shell_utils.
command_and_retval
(chan: paramiko.channel.Channel, prompt: str, command: str, stdout_handler: typing.Union[tbot.log.LogStdoutHandler, NoneType] = None) → typing.Tuple[int, str][source]¶ Execute a command and return it’s output and return value
Parameters: - chan (paramiko.channel.Channel) – Channel to execute this command on
- prompt (str) – Prompt to be expected
- command (str) – Command to be executed (no trailing
\n
) - stdout_handler (tbot.log.LogStdoutHandler) – Optional stdout handler to write output lines to
Returns: The return-code and output of the command
Return type:
-
tbot.machine.shell_utils.
exec_command
(chan: paramiko.channel.Channel, prompt: str, command: str, stdout_handler: typing.Union[tbot.log.LogStdoutHandler, NoneType] = None) → str[source]¶ Execute a command and return it’s output
Parameters: - chan (paramiko.channel.Channel) – Channel to execute this command on
- prompt (str) – Prompt to be expected
- command (str) – Command to be executed (no trailing
\n
) - stdout_handler (tbot.log.LogStdoutHandler) – Optional stdout handler to write output lines to
Returns: The output of the command
Return type:
-
tbot.machine.shell_utils.
read_to_prompt
(chan: paramiko.channel.Channel, prompt: str, stdout_handler: typing.Union[tbot.log.LogStdoutHandler, NoneType] = None, prompt_regex: bool = False) → str[source]¶ Read until the shell waits for further input
Parameters: - chan (paramiko.channel.Channel) – Channel to read from
- prompt (str) – Prompt to be waited for
- stdout_handler (tbot.log.LogStdoutHandler) – Optional stdout handler to write output lines to
- prompt_regex (bool) – Wether the prompt string is to be interpreted as a regular expression (read_to_prompt will add a $ to the end of your expression to ensure it only matches the end of the output)
Returns: The read string (including the prompt)
Return type:
-
tbot.machine.shell_utils.
setup_channel
(chan: paramiko.channel.Channel, prompt: str) → None[source]¶ Setup a paramiko channel
Parameters: - chan (paramiko.channel.Channel) – The channel to be set up
- prompt (str) – The prompt that should be used, has to be very unique!
Returns: Nothing
Return type:
Machine Manager¶
-
class
tbot.machine.machine.
MachineManager
(tb: tbot.TBot, conn: typing.Union[paramiko.client.SSHClient, NoneType] = None) → None[source]¶ A container to manage the list of available machines
-
clear
() → None. Remove all items from D.¶
-
copy
() → a shallow copy of D¶
-
fromkeys
()¶ Returns a new dict with keys from iterable and values equal to value.
-
get
(k[, d]) → D[k] if k in D, else d. d defaults to None.¶
-
items
() → a set-like object providing a view on D's items¶
-
keys
() → a set-like object providing a view on D's keys¶
-
pop
(k[, d]) → v, remove specified key and return the corresponding value.¶ If key is not found, d is returned if given, otherwise KeyError is raised
-
popitem
() → (k, v), remove and return some (key, value) pair as a¶ 2-tuple; but raise KeyError if D is empty.
-
setdefault
(k[, d]) → D.get(k,d), also set D[k]=d if k not in D¶
-
update
([E, ]**F) → None. Update D from dict/iterable E and F.¶ If E is present and has a .keys() method, then does: for k in E: D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]
-
values
() → an object providing a view on D's values¶
-