The LibYUI framework brings enormous advantage when you need an application which can be used with X and ncurses. But while for Qt, integration testing is a solved problem, meaning there are multiple tools available, the situation is not that rose-colored in case of ncurses. On top, using different tooling would require additional efforts for the framework development. So everything started with openQA, which is using screen comparison with advanced fuzzy logic. This approach kept the costs of the tests development low, but maintenance is still painful when UI changes.
Considering all of the above, Ladislav Slezák and Rodion Iafarov has been working on a proper solution taking Ladislav’s proposal for Hack Week 15 as starting point. The idea is plain simple: provide an HTTP/JSON API which allows interacting with LibYUI by reading and setting different UI properties. Consequently, if some button was moved, resized or got new shortcut key assigned, we do not need to adapt the test code anymore.
Obviously, this functionality is not required in a production system, so we have created separate packages for this purpose. Here you can find GitHub repository containing some documentation.
Demo time!
As cool as it sounds, it is even better when you see it in action. In the screencast below you can see how the user can interact with YaST Host module using cURL from the command line.
How to Test the New Packages
If you want to give it a try, you can use the packages we have prepared for you. However, it is recommended to use a virtual machine to not pollute (or accidentally break) your system. You have been warned.
First of all, you need to get new packages, which are currently
available in YaST:Head project in OBS. Navigate to Repositories
tab and get the repository which matches the distribution you are
running. Afterwards you should be able to install libyui-rest-api
package. Also, you need to update related packages and YaST2 modules
were recompiled using latest LibYUI. To do that, simply run the
following command, where YaST:Head
is the repository added in the
previous step:
zypper up --allow-vendor-change -r YaST:Head
With the required software in place, you need to start a YaST module
setting the environment variable Y2TEST
to 1:
xdg-su -c 'Y2TEST=1 YUI_HTTP_PORT=9999 yast2 host' # for Qt
sudo Y2TEST=1 YUI_HTTP_PORT=9999 yast2 host # for ncurses
To allow remote connections you can add YUI_HTTP_REMOTE=1
. For
security reasons, only connections from localhost
are allowed by
default.
Now you should be able to see something like the screenshot below by
navigating with your browser to http://localhost:9999
.
Further steps
As you can see, we have not implemented a wrapper for the POST and GET requests to the HTTP server yet, although it will be the next step. We are trying to to find a solution which allows us running tests locally from the terminal, in CI using stable distribution versions, and finally in openQA for development builds.
Other things which are coming:
- Split the package into separate ncurses and Qt parts (fewer dependencies, not possible to test a minimal system without X).
- Improve the plugin loading.
- Support for more widgets and attributes.
- Add basic authentication support.
- Improve security adding support for encryption and peer verification via SSL.
- Add support for the Gtk based UI.
- Add IPv6 support (example). After all, we are already in 2019.
Security Notice
YaST is usually running with the root
permissions, that means
everybody who can connect to the HTTP/JSON API can read the values and
send button clicks. And because there is no authentication yet, this is
a big security problem. In a nutshell: do not use the API in
production systems! It has been designed only for testing in a secure
environment.
Closing Thoughts
We are pretty excited about this project for several reasons. On the one hand, because we expect it to reduce the maintenance burden of our integration tests. On the other hand, because it is a nice example of Hack Week benefits and cross-team collaboration.
If you are interested, we will try to keep you in the loop by posting information regularly as part of YaST sprints reports.