As the GSoC coding period starts tomorrow, today seems like the last good day to write a little about the project design. For that reason, I created a little diagram in dia:
As you can see there, the project code is currently broken down into three repositories. The main code repository, called
pms-test-suite.git is going to hold the core project code — main scripts, library-handling Python modules and so on. The
pms-test-suite-library.git repository is going to contain the bundled test library, and
pms-test-suite-overlay.git holds temporary test ebuilds and the eclass.
Looking from the left hand side, you can see a greyed out part with the
test-generator script in the middle of it. This module is not a part of GSoC design goals but a possible future guideline. It is supposed to read the human-readable definitions from the Package Manager Specification, match them with helper data and create a complete test library. However, right now the project will simple use a bundled test library.
The test library will consist of modules describing various tests for PMS compliance. Each of these modules, called a test case will provide at least the following information:
- A human-readable test description (which will be reused in program output and ebuild
- a list of relevant
EAPIs for which ebuilds will be generated,
- definitions of ebuild-specific variables and phase functions necessary to perform the test,
- a test result checking function, possibly EAPI-conditional.
Those test cases will be reused by two other PMS Test Suite scripts. The
ebuild-generator module will use them to generate the ebuilds resembling the particular tests, and the
test-runner module will use them to check the test results.
test-runner script will perform the most important task of testing a particular Package Manager. It is supposed to match the test cases with generated ebuilds (or even call
ebuild-generator internally), run the Package Manager on them and collect the results. The results will be used then to determine whether the test case succeeded, failed or its result is ambiguous.
The test ebuilds will use an PM-independent method of exchanging information with the
test-runner module. The internal details of this communication will be handled in the
pms-test.eclass. Right now, this code uses D-Bus for this task.
The main purpose of the PMS Test Suite project is to test Package Managers for compliance with the PMS. In order to do that, the suite has to supply a particular PM with test ebuilds, run it and check the test results.
Test ebuilds are often very similar one to another. Many of the common tests require running with more than a single EAPI — resulting in ebuilds differing only in a single
EAPI line. Considering that, writing test ebuilds manually and maintaining them in that form doesn’t seem like a good idea. That’s why PMS Test Suite will come with a custom test library format.
The test library will be the heart of the whole project. It will supply it with all the test case details necessary to create an appropriate ebuild, run the PM on it and parse the results. That’s why it is very important to choose an elegant and efficient format for the test cases in the library.
Right now, I’m considering using one of the following scripting languages for the test cases:
(bash test case example)
- simple syntax,
- same solution as used in ebuilds,
- lazy code parsing — it is possible to declare phase functions as actual functions and grab their code afterwards.
- requires a lot of effort to parse,
- slow and CPU-intensive execution,
- limited datatypes,
- more complex operations rely on external utilities.
(lua test case example)
- simple yet powerful,
- introduces another language in the workflow,
- requires installing additional packages.
(python test case example)
- ability to use class inheritance,
- no additional tools required,
- byte-compiled code.
- more complex syntax,
- requirement of fixed namespace or hacks in order to load libraries efficiently.
Considering that the core PMS Test Suite will be written in Python, using the same language for the test library seems to be the way to go. The test cases can subclass an appropriate, common PMSTest class and then the whole library parsing would be limited to loading the modules and instantiating the classes providing by them.
Hello everyone. My name’s Michał Górny, and I’m a Gentoo dev since October last year. This year I’m working in a GSoC project called the PMS Test Suite and this is the most important topic which will be covered by this blog right now.
You can expect me to write about my other Gentoo involvements too, including the set of
app-portage/ tools I’m author of, and the intended but long delayed systemd ebuilds introduction.