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.
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
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. 🙂
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.
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.