mirror of
https://git.yoctoproject.org/git/poky
synced 2026-01-01 13:58:04 +00:00
Update the "Running Patchtest Selftest to include a cmdline example of runing the selftest. (From OE-Core rev: 5b2153c8467657ffe490c6b10a260b63d93f3296) Signed-off-by: Trevor Woerner <twoerner@gmail.com> Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
302 lines
12 KiB
Plaintext
302 lines
12 KiB
Plaintext
# Patchtest
|
|
|
|
## Introduction
|
|
|
|
Patchtest is a test framework for community patches based on the standard
|
|
unittest python module. As input, it needs three elements to work properly:
|
|
|
|
- one or more patches in separate, mbox-formated files
|
|
- a test suite
|
|
- a target repository
|
|
|
|
The first test suite intended to be used with patchtest is found in the
|
|
openembedded-core repository [1], targeted for patches that get into the
|
|
openembedded-core mailing list [2]. This suite is also intended as a
|
|
baseline for development of similar suites for other layers as needed.
|
|
|
|
Patchtest can either run on a host or a guest machine, depending on
|
|
which environment you prefer. If you plan to test your own patches (a
|
|
good practice before these are sent to the mailing list), the easiest
|
|
way is to install and execute on your local host; on the other hand, if
|
|
automatic testing is intended, the guest method is strongly recommended.
|
|
The guest method requires the use of the meta-patchtest layer, in
|
|
addition to the tools available in oe-core:
|
|
https://git.yoctoproject.org/meta-patchtest/
|
|
|
|
## Installation
|
|
|
|
Patchtest checks patches which are expected to be applied to
|
|
Yocto layers. Therefore, familiarity with the Yocto Project, its
|
|
functionality, and image-build processes is assumed. Otherwise the
|
|
[quick start guide](https://docs.yoctoproject.org/brief-yoctoprojectqs/index.html)
|
|
contains the necessary information.
|
|
|
|
As a Python application, the recommended way it should be installed
|
|
(following Python best practices) is to use a virtual environment. A
|
|
Python virtual environment provides a convenient sandbox into which its
|
|
requirements can also be installed with out affecting a user's entire
|
|
system at large. Patchtest makes use of a test suite found in oe-core,
|
|
so it needs to be available as well.
|
|
|
|
For example, to install patchtest into a Python virtual environment
|
|
called "patchtest.venv" located at some/where in your filesystem:
|
|
|
|
$ mkdir -p some/where
|
|
$ cd some/where
|
|
$ mkdir yocto
|
|
$ pushd yocto
|
|
$ git clone https://git.openembedded.org/openembedded-core
|
|
$ git clone https://git.openembedded.org/bitbake
|
|
$ git clone https://git.yoctoproject.org/meta-patchtest
|
|
$ popd
|
|
$ . yocto/openembedded-core/oe-init-build-env build yocto/bitbake
|
|
$ cd ..
|
|
$ python3 -m venv patchtest.venv
|
|
$ . patchtest.venv/bin/activate
|
|
(patchtest.venv) $ pip install -r yocto/openembedded-core/meta/lib/patchtest/requirements.txt
|
|
|
|
In the above list of cloned repositories, the meta-patchtest layer is
|
|
only needed if you intend to use patchtest in "guest" mode. Also the
|
|
oe-core + bitbake clones can be replaced with poky instead.
|
|
|
|
If "guest" mode will be used, the meta-patchtest layer needs to be added
|
|
to the conf/bblayers.conf file generated above.
|
|
|
|
If you would like to run the patchtest selftest found in oe-core, the
|
|
openembedded-core/meta-selftest (or poky/meta-selftest, if using poky)
|
|
layer also needs to be added to bblayers.conf.
|
|
|
|
Once the installation is done, your directory layout will look like:
|
|
.
|
|
├── build
|
|
│ └── conf
|
|
├── yocto
|
|
│ ├── bitbake
|
|
│ ├── meta-patchtest
|
|
│ └── openembedded-core
|
|
└── patchtest.venv
|
|
├── bin
|
|
├── include
|
|
├── lib
|
|
├── lib64 -> lib
|
|
├── pyvenv.cfg
|
|
└── share
|
|
|
|
For git-pw (and therefore scripts such as patchtest-get-series) to work, you need
|
|
to provide a Patchwork instance in your user's .gitconfig, like so (alternatively
|
|
the project can be specified using the --project argument to git-pw on its
|
|
cmdline):
|
|
|
|
git config --global pw.server "https://patchwork.yoctoproject.org/api/1.2/"
|
|
|
|
## Usage
|
|
|
|
### Obtaining Patches
|
|
|
|
Separate, mbox-formatted patch files can be obtained in a number of
|
|
ways:
|
|
|
|
- using b4 to obtain patches from a lore server
|
|
- using git-pw to obtain patches from a patchwork server
|
|
- using "git format-patch ..." to create patches from a git
|
|
repository
|
|
- using an email program, such as mutt or thunderbird, to obtain
|
|
patches from a mailing list
|
|
|
|
Alternatively, `scripts/patchtest-get-series` can be used to pull mbox files from
|
|
the Patchwork instance configured previously in .gitconfig. It uses a log file
|
|
called ".series_test.log" to store and compare series IDs so that the same
|
|
versions of a patch are not tested multiple times unintentionally. By default,
|
|
it will pull up to five patch series from the last 30 minutes using oe-core as
|
|
the target project, but these parameters can be configured using the `--limit`,
|
|
`--interval`, and `--project` arguments respectively. For more information, run
|
|
`patchtest-get-series -h`.
|
|
|
|
#### git-pw
|
|
|
|
git-pw can be used with filters for users, patch/series IDs, and
|
|
timeboxes if specific patches are desired. For more information, see the
|
|
git-pw [documentation](https://patchwork.readthedocs.io/projects/git-pw/en/latest/).
|
|
|
|
For example, to download a single patch from the Yocto Project's
|
|
Patchwork server (and to demonstrate not having modified ~/.gitconfig):
|
|
|
|
(patchtest.venv) $ mkdir gawk
|
|
(patchtest.venv) $ git-pw --server https://patchwork.yoctoproject.org/api/1.2/ --project oe-core patch download --mbox 70101 gawk/
|
|
|
|
To download a series, for example, try:
|
|
|
|
(patchtest.venv) $ mkdir clang
|
|
(patchtest.venv) $ git-pw --server https://patchwork.yoctoproject.org/api/1.2 --project oe-core series download --separate 38107 clang/
|
|
|
|
#### git format-patch
|
|
|
|
Patch files can be obtained directly from a git repository using `git
|
|
format-patch -N` (where N is the number of patches starting from HEAD to
|
|
generate) or using any other way of specifying a range of commit SHAs to
|
|
git.
|
|
|
|
This method would be the most likely used when testing patches in local
|
|
mode before emailing them for review.
|
|
|
|
#### b4
|
|
|
|
In order to use b4, it needs to be installed. Fortunately it is a Python
|
|
program that is hosted on pypi and can easily be installed into the same
|
|
Python virtual environment that was created to run patchwork:
|
|
|
|
(patchtest.venv) $ pip install b4
|
|
(patchtest.venv) $ b4 --version
|
|
0.14.2
|
|
|
|
To fetch the same single patch using b4 that was fetched with git-pw
|
|
earlier, use:
|
|
|
|
(patchtest.venv) $ mkdir gawk-2
|
|
(patchtest.venv) $ b4 am -o gawk-2 https://lore.kernel.org/openembedded-core/20250912200740.2873851-1-Randy.MacLeod@windriver.com
|
|
|
|
Fetching a patch series with b4 is a little more involved since b4 will
|
|
create one mbox file with all the patches in the series in it. Given an
|
|
mbox file with more than one patch in it, patchtest will only test the
|
|
first one. So there needs to be a separate step to break apart the
|
|
multiple patches into separate files:
|
|
|
|
(patchtest.venv) $ mkdir clang-2
|
|
(patchtest.venv) $ b4 am -o ross https://lore.kernel.org/openembedded-core/20250914133258.2625735-1-ross.burton@arm.com
|
|
(patchtest.venv) $ cat clang-2/v2_20250914_ross_burton_clang_improve_opt_viewer_packageconfig.mbx | formail -ds sh -c 'cat > ross/msg.$FILENO'
|
|
|
|
NOTE: the formail utility is part of the procmail package for most Linux
|
|
distributions.
|
|
|
|
#### mail user agents (MUA)
|
|
|
|
Most email applications have a way of saving patch emails. Details for
|
|
each MUA is beyond the scope of this document, but it is possible in
|
|
most cases. The only catch is that each patch has to be saved in mbox
|
|
format in its own individual file. Some client applications prefer to
|
|
save emails in the Maildir format, and some programs will save a set of
|
|
patches into one mbox file. The formail program from the procmail
|
|
package is useful for manipulating and converting between formats and
|
|
storage formats.
|
|
|
|
### Host Mode
|
|
|
|
To run patchtest in "host" mode, do the following:
|
|
|
|
1. Using openembedded-core or poky, do the following if re-using the
|
|
installation given in the installation procedure above:
|
|
|
|
$ . yocto/openembedded-core/oe-init-build-env build yocto/bitbake
|
|
|
|
or
|
|
|
|
$ . yocto/poky/oe-init-build-env
|
|
|
|
2. Activate the Python virtual environment that was created using the
|
|
steps from the installation procedure given above:
|
|
|
|
$ . patchtest.venv/bin/activate
|
|
|
|
3. Obtain one or more patches (see section above)
|
|
|
|
4. Run patchtest on a patch file by doing the following:
|
|
|
|
(patchtest.venv) $ patchtest --patch /path/to/patch/file
|
|
|
|
or, if you have stored the patch files in a directory, do:
|
|
|
|
(patchtest.venv) $ patchtest --directory /path/to/patch/directory
|
|
|
|
For example, to test
|
|
`master-gcc-Fix--fstack-protector-issue-on-aarch64.patch` against the
|
|
oe-core test suite:
|
|
|
|
(patchtest.venv) $ patchtest --patch master-gcc-Fix--fstack-protector-issue-on-aarch64.patch
|
|
|
|
If you want to use a different test suite or target repository, you
|
|
can use the --testdir and --repodir flags:
|
|
|
|
(patchtest.venv) $ patchtest --patch /path/to/patch/file --repodir /path/to/repo --testdir /path/to/test/dir
|
|
|
|
### Guest Mode
|
|
|
|
Patchtest's guest mode has been refactored to more closely mirror the
|
|
typical Yocto Project image build workflow, but there are still some key
|
|
differences to keep in mind. The primary objective is to provide a level
|
|
of isolation from the host when testing patches pulled automatically
|
|
from the mailing lists. When executed this way, the test process is
|
|
essentially running random code from the internet and could be
|
|
catastrophic if malicious bits or even poorly-handled edge cases aren't
|
|
protected against. In order to use this mode, the
|
|
https://git.yoctoproject.org/meta-patchtest/ repository must be cloned
|
|
and added to bblayers.conf.
|
|
|
|
The general flow of guest mode is:
|
|
|
|
1. Run patchtest-setup-sharedir --directory <dirname> to create a
|
|
directory for mounting
|
|
2. Collect patches via patchtest-get-series (or other manual step) into the
|
|
<dirname>/mboxes path
|
|
3. Ensure that a user with ID 1200 has appropriate read/write
|
|
permissions to <dirname> and <dirname>/mboxes, so that the
|
|
"patchtest" user in the core-image-patchtest image can function
|
|
4. Build the core-image-patchtest image
|
|
5. Run the core-image-patchtest image with the mounted sharedir, like
|
|
so:
|
|
`runqemu kvm nographic qemuparams="-snapshot -fsdev
|
|
local,id=test_mount,path=/workspace/yocto/poky/build/patchtestdir,security_model=mapped
|
|
-device virtio-9p-pci,fsdev=test_mount,mount_tag=test_mount -smp 4 -m
|
|
2048"`
|
|
|
|
Patchtest is run by an initscript for the core-image-patchtest image and
|
|
shuts down after completion, so there is no input required from a user
|
|
during operation. Unlike in host mode, the guest is designed to
|
|
automatically generate test result files, in the same directory as the
|
|
targeted patch files but with .testresult as an extension. These contain
|
|
the entire output of the patchtest run for each respective pass,
|
|
including the PASS, FAIL, and SKIP indicators for each test run.
|
|
|
|
### Running Patchtest Selftests
|
|
|
|
Patchtest also includes selftests, which are currently in the form of
|
|
several contrived patch files and a runner script found in
|
|
`meta/lib/patchtest/selftest/`. In order to run these, the
|
|
`meta-selftest` layer must be added to bblayers.conf. It is also
|
|
recommended to set BB_SERVER_TIMEOUT (and thus enable memory-resident
|
|
bitbake) in local.conf to reduce runtime, as the bitbake startup process
|
|
will otherwise add to it significantly when restarted for each test
|
|
patch.
|
|
|
|
If you have setup a Python virtual environment and sourced the
|
|
oe-init-build-env script to run patchtest following the directions
|
|
provided above in the "Installation" section, and you have added the
|
|
meta-selftest layer (from oe-core or poky) to your build, running the
|
|
patchtest selftest is as simple as:
|
|
|
|
(patchtest.venv) $ yocto/openembedded-core/meta/lib/patchtest/selftest/selftest
|
|
|
|
or:
|
|
|
|
(patchtest.venv) $ yocto/poky/meta/lib/patchtest/selftest/selftest
|
|
|
|
## Contributing
|
|
|
|
The yocto mailing list (openembedded-core@lists.openembedded.org) is used for questions,
|
|
comments and patch review. It is subscriber only, so please register before
|
|
posting.
|
|
|
|
When sending single patches, please use something like:
|
|
|
|
git send-email -M -1 --to=openembedded-core@lists.openembedded.org --subject-prefix=OE-core][PATCH
|
|
|
|
## Maintenance
|
|
-----------
|
|
|
|
Maintainers:
|
|
Trevor Gamblin <tgamblin@baylibre.com>
|
|
|
|
## Links
|
|
-----
|
|
[1] https://git.openembedded.org/openembedded-core/
|
|
[2] https://www.yoctoproject.org/community/mailing-lists/
|