== Test API

All tests run by {app-name} are python script files. On top of usual python
standard features, {app-name} provides a set of public APIs and tools that
these tests can use in order to interact with the core of {app-name}, like
creating object classes, run processes synchronously or asynchronously, wait for
events, retrieve specific configuration, etc. This section aims at documenting
the most relevant tools available for tests.

First of all, it is important to avoid blocking out of the core's main event loop in
the test, since doing that will prevent {app-name} core functionalities to work
properly, such as control of asynchronous processes.

To get access to those functionalities, a test must import a test environment
previously prepared by {app-name} before the test was started:
[source,python]
----
#!/usr/bin/env python3
from osmo_gsm_tester.testenv import *
----

After the test environment is imported, aome usual functionalities are available
directly under the global scope. Specially noticeable is the existence of object
_tenv_, which provides access to most of the functionalities.

The test can simply ask {app-name} to sleep some time, while giving control back
to {app-name} core's mainloop:
[source,python]
----
sleep(3) # sleep for 3 seconds
----

One can also wait for events in the background, for instance launch a child
process locally in the same host and wait for its termination:
[source,python]
----
proc = process.Process('process_description_name', working_dir_to_store_logs, 'sleep 4') <1>
tenv.remember_to_stop(proc) <2>
proc.launch() <3>
proc.wait() <4>
----
<1> Create process object. This line doesn't yet runs it.
<2> Make sure the core will kill the process if this test fails
<3> Start process asynchronously
<4> wait until process is done. One could waiting generically here too: _wait(proc.terminated)_

If running asynchronously is not needed, one can run synchronously in an easy
way:
[source,python]
----
proc = process.Process('process_description_name', working_dir_to_store_logs, 'sleep 4')
proc.launch_sync()
----

One can also log output using either the regular _print_ function from python,
or using {app-name} specific functions available:
[source,python]
----
log('this is a regular log message')
dbg('this is a dbg message, only printed on outputs where dbg is enabled')
err('outputs log message for non-expected events')
print('this is the same as log()')
----

The test also gains access to suite and/or test specific configuration through
different APIs:
[source,python]
----
test_config = tenv.config_test_specific()
threshold = int(test_config.get('threshold', 2))
suite_config = tenv.config_suite_specific()
foobar = suite_config['foobar']
----

A test requiring a really specific config file for an object class it is going
to run can provide its own template files by overlaying an own directory
containing them on top of the usual default directory where object class
templates are (_osmo-gsm-tester.git/src/osmo_gsm_tester/obj/templates/_):
[source,python]
----
tenv.set_overlay_template_dir(os.path.join(os.path.dirname(__file__), 'mytemplatedir'))
----

Several tests in a suite can also share code by using some APIs provided by
{app-names}. The shared python code must be placed in files under the 'lib/'
subdirectory in the suite directory where the test belongs to.
[source,python]
----
# File containing function foobar() available under ${suite_dir}/lib/testlib.py:
import testlib
tenv.test_import_modules_register_for_cleanup(testlib)
from testlib import foobar
----

For a complete set of features and how to use them, one can have a look at real
examples present in {app-name} git repository under the _sysmocom/_ directory.
Besides those, have a look too a _testenv.py_ file, which implements the 'tenv'
object available to tests.

=== Test verdict

In general, a test reaching the end of the file and returning control to
{app-name} core will be flagged as a successful test (PASS).

If an exception is thrown from within the test file and propagated to
{app-name}, the test will be considered as failed and {app-name} will store all
failure related information from the caught exception.
