GstValidate Test file
A .validatetest file describes a fully contained validate test case. It
includes the arguments of the tool supposed to be used to run the test as well
as possibly a configuration and a set of action to
describe the validate scenario.
The file format
A validate test file requires a meta structure describing
the test and configuring it. The meta structure should be either the
first or the one following the set-globals structure. The set-globals
structures allows you to set global variables for the rest of the
.validatetest file and is a free form variables setter. For example you can
do:
set-globals, media_dir=$(test_dir)/../../media
Tool arguments
In the case of gst-validate it has to contain an
args field with gst-validate argv arguments like:
# This is the default tool so it is not mandatory for the `gst-validate` tool
tool = "gst-validate-$(gst_api_version)",
args = {
# pipeline description
videotestrc num-buffers=2 ! $(videosink),
# Random extra argument
--set-media-info $(test-dir)/some.media_info
}
Variables
Validate testfile will define some variables to make those files relocable:
-
$(test_dir): The directory where the.validatetestfile is in. -
$(test_name): The name of the test file (without extension). -
$(test_name_dir): The name of the test directory (test_name with folder separator instead of.). -
$(validateflow): Legacy variable that expands to the validateflow structure name withexpectations-dirandactual-results-dirset. Not needed when using the nested structure syntax (e.g.[validateflow, pad=sink:sink]) since directories are auto-derived from the test file path. -
$(videosink): The GStreamer videosink to use if the test can work with different sinks for the video. It allows the tool to use fakesinks when the user doesn't want to have visual feedback for example. -
$(audiosink): The GStreamer audiosink to use if the test can work with different sinks for the audio. It allows the tool to use fakesinks when the user doesn't want to have audio feedback for example.
tested-elements
To register action types for specific GStreamer plugins and elements this field
can be used so GstValidate will ensure that the class_init function of that
specific element will be called before running the scenario. Such elements
should register action types from there.
Adding a test to gst-integration-testsuites
The gst-integration-testsuites subproject contains the main collection of
validate tests. Tests are placed under
subprojects/gst-integration-testsuites/testsuites/validate/ and organized by
element or category:
testsuites/validate/<category>/<test_name>.validatetest
For example:
validate/appsrc/single_push.validatetestvalidate/mp4/qtdemux_seek_past_end.default.validatetestvalidate/h264/parse.trickmode_predicted.seek_trickmode_predicted.validatetest
Test discovery
Tests are automatically discovered by
GstValidateSimpleTestsGenerator in
testsuites/validate.py. There is no manual registration step — placing a
.validatetest file under testsuites/validate/ is sufficient.
The test name is derived from the file path relative to testsuites/validate/,
with path separators replaced by dots and the .validatetest extension
stripped. For example validate/mp4/qtdemux_seek_past_end.default.validatetest
becomes validate.mp4.qtdemux_seek_past_end.default.
ValidateFlow expectations
When a test uses $(validateflow), the expected output is stored in a sibling
directory whose name matches the test filename (without the .validatetest
extension):
validate/<category>/<test_name>/flow-expectations/log-<element>-<pad>-expected
For example validate/appsrc/single_push.validatetest stores its expectations
in validate/appsrc/single_push/flow-expectations/log-fakesink0-sink-expected.
To generate the initial expectation files, run the test once — it will fail and write the expected files in the right place. Review them before committing.
Step by step
-
Create your
.validatetestfile under the appropriate category directory intestsuites/validate/<category>/. Create the category directory if needed. -
If the test uses
$(validateflow), run it once to generate the expected output, review it, and place it under the correspondingflow-expectations/directory. -
Regenerate the tests list and commit it:
gst-validate-launcher -L
git add testsuites/validate.testslist
- Commit the
.validatetestfile, any flow-expectations, and the updated testslist together.
Adding media files
Media files used by tests live in the media/ directory of
gst-integration-testsuites, which is a separate git repository using
git-lfs for binary file storage. The files are
organized by container format under media/defaults/ (e.g. mp4/,
matroska/, ogg/, etc.) with additional directories for specialized content
(fragments/, encrypted/, adaptivecontent/, etc.).
Keep media files as small as possible — they are downloaded by every developer and CI run. A few seconds of content is usually enough to exercise the code path you need to test.
To reference media files from a .validatetest file, use set-globals to
define a relative path through $(test_dir):
set-globals, media_dir="$(test_dir)/../../../media/"
meta,
args = {
"filesrc location=$(media_dir)/defaults/mp4/raw_h264.0.mp4 ! qtdemux ! fakesink",
}
Steps to add a new media file
Since the media/ directory is a separate git repository, the new media file
must be available on origin before the .validatetest that uses it can run in
CI. This means the media change has to either be merged first or pushed to a
branch on origin, and the submodule reference in the main repository updated
to point to that commit.
-
Make sure the media file extension is tracked by git-lfs in the
media/repository (check.gitattributes). If not, add it:cd media/ git lfs track "*.ext" -
Place the file under the appropriate subdirectory in
media/defaults/(orfragments/,encrypted/, etc.). -
Commit and push the media file (and any updated
.gitattributes) tooriginin themedia/repository. -
Update the submodule reference in the main
gstreamerrepository to point to the commit containing the new media file.
Note: You may see
.media_infofiles in themedia_info/directory ofgst-integration-testsuites. These are used by the test generation system that automatically creates test combinations by running all existing.scenariofiles against each media file. They live in the main repository (not in themedia/submodule) so they can be updated atomically with code changes. Adding a.media_infofor a new file is generally not needed — writing a.validatetestfile that references the media directly is the preferred approach.
The results of the search are