Part of software system development is to write tests. More than writing tests, developers want to set up a CI that will automatically (each commit, day, …) check the status of the project tests. While it is easy to use Travis as a CI system thanks to the work of smalltalkCI, setting up Travis to test FFI binding is more tedious.
In the following, I will present the configuration used to test Pharo-LibVLC. Pharo-LibVLC allows one to script VLC from Pharo, so one can play and control music or video.
Travis Set up
First of all, we need to set up the Travis CI. To do so, we create two configuration files: .smalltalk.ston and .travis.yml. Below, I present the default .smalltalk.ston for the VLC Pharo package. It allows one to execute the tests loaded by the VLC baseline. However, such tests might need external library to work, for instance the VLC library.
SmalltalkCISpec { #loading : [ SCIMetacelloLoadSpec { #baseline : 'VLC', #directory : 'src' } ] }
.smalltalk.ston
Installing an external library
A project using FFI may need to install the corresponding library to work. Often, as a FFI binding project developer, you know the main library (in the case of VLC, it is libvlc). However, this library has dependencies (in the case of VLC, it is libvlccore). There are many ways to determine all the libraries you need on your system to use your FFI binding. A simple one is to use the command ldd on the main library.
Once the needed libraries are identified, we have to configure Travis to install those libraries and add them to the PATH. For the installation, the best way is to rely on the apt addon of Travis.
language: smalltalk dist: bionic os: - linux before_install: - . ci/before_install.sh - export PATH=$PATH:/usr/lib addons: apt: update: true packages: - libvlc-dev - libvlccore-dev - vlc smalltalk: - Pharo64-8.0 - Pharo64-9.0 matrix: fast_finish: true allow_failures: - smalltalk: Pharo64-9.0
.travis.yml
Extra configuration (export display)
Additionally to the libraries, an FFI project may need to access to a screen. It is the case of VLC that can spawn windows to display video. Travis comes with a solution to test GUI. We then only need to export the Display to port :99. For instance, with VLC, we add a script in the before_install step of Travis. It will execute the file ci/before_install.sh that set up the display.
#!/bin/bash set -ev # Setup display export DISPLAY=:99.0
before_install.sh
Use external resources with GitBridge
Finally, you may need external resources to test your FFI binding. For instance, in VLC, I need music and video files. I propose to add the needed resources in the github repository and to use them for the test. However, it is difficult to set up tests that work on your local filesystem, others filesystem, and with Travis.
Hopefully, Cyril Ferlicot has developed GitBridge. This project allows one to access easily resources present in a local git repository. After adding GitBridge to the VLC FFI project, we can get a FileReference to the folder res of the VLC FFI project by executing the method res of the bridge
However, a last configuration set up is needed to use GitBridge with Travis. It consists on executing a Pharo script. To do so, we change the .smalltalk.ston to execute a specific file.
SmalltalkCISpec { #loading : [ SCIMetacelloLoadSpec { #baseline : 'VLC', #directory : 'src' } ], #preTesting : SCICustomScript { #path : 'res/ci/addRepoToIceberg.st' } }
.smalltalk.ston
Finally, the addRepoToIceberg.st file contains the script that will add to Iceberg the git project.
(IceRepositoryCreator new location: '.' asFileReference; subdirectory: 'src'; createRepository) register
addRepoToIceberg.st
And now you are done!