Buildspec Overview¶
What is a buildspec?¶
A buildspec is a YAML file that defines your test in buildtest which is validated by schema followed by building a shell script and running the generated test. Buildtest will parse the buildspec with the global schema file which defines the top-level structure of buildspec file.
Example¶
Let’s start off with a simple example that declares two variables X and Y and prints the sum of X+Y.
buildspecs:
add_numbers:
type: script
executor: generic.local.bash
description: Add X+Y
tags: [tutorials]
vars:
X: 1
Y: 2
run: echo "$X+$Y=" $(($X+$Y))
buildtest will validate the entire file with global.schema.json
, the schema
requires version and buildspec in order to validate file. The buildspec
is where you define each test. The name of the test is add_numbers.
The test requires a type field which is the sub-schema used to validate the
test section. In this example type: script
informs buildtest to use the Script Schema
when validating test section.
Each subschema has a list of field attributes that are supported, for example the fields: type, executor, vars and run are all valid fields supported by the script schema.
Let’s look at a more interesting example, shown below is a multi line run example using the script schema with test name called systemd_default_target, shown below is the content of test:
buildspecs:
systemd_default_target:
executor: generic.local.bash
type: script
tags: [system]
description: check if default target is multi-user.target
run: |
if [ "multi-user.target" == `systemctl get-default` ]; then
echo "multi-user is the default target";
exit 0
fi
echo "multi-user is not the default target";
exit 1
The test name systemd_default_target defined in buildspec section is
validated with the following pattern "^[A-Za-z_][A-Za-z0-9_]*$"
. This test
will use the executor generic.local.bash which means it will use the Local Executor
with an executor name bash defined in the buildtest settings. The default
buildtest settings will provide a bash executor as follows:
system:
generic:
hostnames: ["localhost"]
executors:
local:
bash:
description: submit jobs on local machine using bash shell
shell: bash
The shell: bash
indicates this executor will use bash to run the test scripts.
To reference this executor use the format <system>.<type>.<name>
in this case generic.local.bash
refers to bash executor.
The description
field is an optional key that can be used to provide a brief
summary of the test. The description field is limited to 80 characters.
In this example we can specify multiple commands in run
section, this
can be done in YAML using run: |
followed by content of run section tab indented
2 spaces.
In this next example, we introduce the summary
field, which can be used as an extended description of test. It has no
impact on the test. Unlike the description
field, the summary field has no limit on character count and one can define multi-line
string using the pipe symbol |.
buildspecs:
summary_example:
type: script
executor: generic.local.bash
description: The summary field can be a multi-line string and exceed 80 char
tags: [tutorials]
summary: |
This is a long description of test that
can exceed 80 characters and be multiline
run: hostname
Script Schema¶
The script schema is used for writing simple scripts (bash, sh, python) in Buildspec.
To use this schema you must set type: script
. The run
field is responsible
for writing the content of test.
Shown below is schema header for script.schema.json.
{
"$id": "script.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "script schema version",
"description": "The script schema is of ``type: script`` in sub-schema which is used for running shell scripts",
"type": "object",
"required": [
"type",
The "type": "object"
means sub-schema is a JSON object
where we define a list of key/value pair. The "required"
field specifies a list of
fields that must be specified in order to validate the Buildspec. In this example, type
, run
, and executor
are required fields. The additionalProperties: false
informs schema to reject
any extra properties not defined in the schema.
The executor key is required for all sub-schemas which instructs buildtest
which executor to use when running the test. The executors are defined in
How to configure buildtest. In our first example we define variables using the
vars
property which is a Key/Value pair for variable assignment.
The run section is required for script schema which defines the content of
the test script.
For more details on script schema see schema docs at https://buildtesters.github.io/buildtest/
Declaring Environment Variables¶
You can define environment variables using the env
property, this is compatible
with shells: bash
, sh
, zsh
, csh
and tcsh
. It does not work with
shell: python
. In example below we declare three tests using environment
variable with default shell (bash), csh, and tcsh
buildspecs:
bash_env_variables:
executor: generic.local.bash
description: Declare environment variables in default shell (bash)
type: script
env:
FIRST_NAME: avocado
LAST_NAME: dinosaur
tags: [tutorials]
run: |
hostname
whoami
echo $USER
printf "${FIRST_NAME} ${LAST_NAME}\n"
csh_env_declaration:
executor: generic.local.csh
type: script
description: "csh shell example to declare environment variables"
shell: /bin/csh
tags: [tutorials]
env:
SHELL_NAME: "csh"
run: echo "This is running $SHELL_NAME"
tcsh_env_declaration:
executor: generic.local.csh
type: script
description: "tcsh shell example to declare environment variables"
shell: /bin/tcsh
tags: [tutorials]
env:
path: "/usr/local/bin:$PATH"
run: echo $path
This test can be run by issuing the following command: buildtest build -b tutorials/environment.yml
.
If we inspect one of the test script we will see that buildtest generates a build script that invokes the test using the
shell wrapper /bin/csh for the csh test and gets the returncode.
#!/bin/bash
############# START VARIABLE DECLARATION ########################
export BUILDTEST_TEST_NAME=csh_env_declaration
export BUILDTEST_TEST_ROOT=/Users/siddiq90/Documents/GitHubDesktop/buildtest/var/tests/generic.local.csh/environment/csh_env_declaration/0
export BUILDTEST_BUILDSPEC_DIR=/Users/siddiq90/Documents/GitHubDesktop/buildtest/tutorials
export BUILDTEST_STAGE_DIR=/Users/siddiq90/Documents/GitHubDesktop/buildtest/var/tests/generic.local.csh/environment/csh_env_declaration/0/stage
export BUILDTEST_TEST_ID=501ec5d3-e614-4ae8-9c1e-4849ce340c76
############# END VARIABLE DECLARATION ########################
# source executor startup script
source /Users/siddiq90/Documents/GitHubDesktop/buildtest/var/executor/generic.local.csh/before_script.sh
# Run generated script
/bin/csh /Users/siddiq90/Documents/GitHubDesktop/buildtest/var/tests/generic.local.csh/environment/csh_env_declaration/0/stage/csh_env_declaration.csh
# Get return code
returncode=$?
# Exit with return code
exit $returncode
This generated test looks something like this
#!/bin/csh
# Declare environment variables
setenv SHELL_NAME csh
# Content of run section
echo "This is running $SHELL_NAME"
Environment variables are defined using export
in bash, sh, zsh while csh and
tcsh use setenv
.
Declaring Variables¶
Variables can be defined using vars
property, this is compatible with all shells
except for python
. The variables are defined slightly different in csh, tcsh as pose
to bash, sh, and zsh. In example below we define tests with bash and csh.
In YAML strings can be specified with or without quotes however in bash, variables
need to be enclosed in quotes "
if you are defining a multi word string (name="First Last"
).
If you need define a literal string it is recommended
to use the literal block |
that is a special character in YAML.
If you want to specify "
or '
in string you can use the escape character
\
followed by any of the special character. In example below we define
several variables such as X, Y that contain numbers, variable literalstring
is a literal string processed by YAML. The variable singlequote and doublequote
defines a variable with the special character '
and "
. The variables
current_user and num_files store result of a shell command. This can
be done using var=$(<command>)
or var=`<command>`
where <command>
is
a Linux command.
buildspecs:
variables_bash:
type: script
executor: generic.local.bash
description: Declare shell variables in bash
tags: [tutorials]
vars:
X: 1
Y: 2
literalstring: this is a literal string
singlequote: \'singlequote\'
doublequote: \"doublequote\"
current_user: "$(whoami)"
num_files: "`find $HOME -type f -maxdepth 1 | wc -l`"
multiline_string: |
Hello my name is Bob \n
I am 30 years old
run: |
echo "$X+$Y="$(($X+$Y))
echo $literalstring
echo $singlequote
echo $doublequote
echo "current user:" $current_user
echo "number of files:" $num_files
echo -e $multiline_string
Next we build this test by running buildtest build -b $BUILDTEST_ROOT/tutorials/vars.yml
.
buildtest build -b $BUILDTEST_ROOT/tutorials/vars.yml
$ buildtest build -b $BUILDTEST_ROOT/tutorials/vars.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:32 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/vars.yml: VALID
Total builder objects created: 1
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ variabl… │ script │ generic… │ None │ None │ None │ Declare │ /home/… │
│ │ │ │ │ │ │ shell │ │
│ │ │ │ │ │ │ variabl… │ │
│ │ │ │ │ │ │ in bash │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
variables_bash/49b09cfb: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/vars/variables_bash/49b09cfb
variables_bash/49b09cfb: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/vars/variables_bash/49b09cfb/stage
variables_bash/49b09cfb: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/vars/variables_bash/49b09cfb/variables_bash_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
variables_bash/49b09cfb does not have any dependencies adding test to queue
variables_bash/49b09cfb: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/vars/variables_bash/49b09cfb/stage
variables_bash/49b09cfb: Running Test via command: bash --norc --noprofile -eo pipefail variables_bash_build.sh
variables_bash/49b09cfb: Test completed in 0.010217 seconds
variables_bash/49b09cfb: Test completed with returncode: 0
variables_bash/49b09cfb: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/vars/variables_bash/49b09cfb/variables_bash.out
variables_bash/49b09cfb: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/vars/variables_bash/49b09cfb/variables_bash.err
In this iteration we are going to run the following tests: [variables_bash/49b09cfb]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ variables_ba │ generic.loc… │ PASS │ None None │ 0 │ 0.010217 │
│ sh/49b09cfb │ │ │ None │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 1/1 Percentage: 100.000%
Failed Tests: 0/1 Percentage: 0.000%
Adding 1 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_jbgrsazt.log
Let’s check the generated script from the previous build, you can run buildtest inspect query -o variables_bash
where
-o refers to output file for testname variables_bash. Take note of the output file we
buildtest inspect query -o variables_bash
$ buildtest inspect query -o variables_bash
───────────── variables_bash/49b09cfb-f06f-437e-be63-a4600bb144da ──────────────
Executor: generic.local.bash
Description: Declare shell variables in bash
State: PASS
Returncode: 0
Runtime: 0.010217 sec
Starttime: 2023/05/26 18:39:32
Endtime: 2023/05/26 18:39:32
Command: bash --norc --noprofile -eo pipefail variables_bash_build.sh
Test Script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/vars/variables_bash/49b09cfb/variables_bash.sh
Build Script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/vars/variables_bash/49b09cfb/variables_bash_build.sh
Output File: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/vars/variables_bash/49b09cfb/variables_bash.out
Error File: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/vars/variables_bash/49b09cfb/variables_bash.err
Log File: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_jbgrsazt.log
─ Output File: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/che… ─
1+2=3
this is a literal string
\'singlequote\'
"doublequote"
current user: docs
number of files: 4
Hello my name is Bob
I am 30 years old
Defining Tags¶
The tags
field can be used to classify tests which can be used to organize tests
or if you want to Building By Tags (buildtest build --tags <TAGNAME>
).
Tags can be defined as a string or list of strings. In this example, the test
string_tag
defines a tag name network while test list_of_strings_tags
define a list of tags named network
and ping
.
buildspecs:
string_tag:
type: script
executor: generic.local.bash
description: tags can be a string
tags: network
run: hostname
list_of_strings_tags:
type: script
executor: generic.local.bash
description: tags can be a list of strings
tags: [network, ping]
run: ping -c 4 www.google.com
Each item in tags must be a string and no duplicates are allowed, for example in this test, we define a duplicate tag network which is not allowed.
buildspecs:
duplicate_string_tags:
type: script
executor: generic.local.bash
description: duplicate strings in tags list is not allowed
tags: [network, network]
run: hostname
If tags is a list, it must contain atleast one item.
Test Status¶
buildtest will record state of each test which can be PASS
or FAIL
. By default a 0 exit code is
PASS and everything else is a FAIL. The status
property can be used to determine how test will report its state.
Currently, we can match state based on the following:
Return Code Matching¶
buildtest can report PASS/FAIL based on returncode, by default a 0 exit code is PASS
and everything else is FAIL. The returncode can be a list of exit codes to match.
In this example we have four tests called exit1_fail
, exit1_pass
,
returncode_list_mismatch
and returncode_int_match
. We expect exit1_fail and
returncode_mismatch to FAIL
while exit1_pass and returncode_int_match
will PASS
.
buildspecs:
exit1_fail:
executor: generic.local.bash
type: script
description: exit 1 by default is FAIL
tags: [tutorials, fail]
run: exit 1
exit1_pass:
executor: generic.local.bash
type: script
description: report exit 1 as PASS
run: exit 1
tags: [tutorials, pass]
status:
returncode: [1]
returncode_list_mismatch:
executor: generic.local.bash
type: script
description: exit 2 failed since it failed to match returncode 1
run: exit 2
tags: [tutorials, fail]
status:
returncode: [1, 3]
returncode_int_match:
executor: generic.local.bash
type: script
description: exit 128 matches returncode 128
run: exit 128
tags: [tutorials, pass]
status:
returncode: 128
Let’s build this test and pay close attention to the status column in output.
buildtest build -b tutorials/test_status/pass_returncode.yml
$ buildtest build -b tutorials/test_status/pass_returncode.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:33 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/pass_returncode.yml: VALID
Total builder objects created: 4
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ exit1_f… │ script │ generic… │ None │ None │ None │ exit 1 │ /home/… │
│ │ │ │ │ │ │ by │ │
│ │ │ │ │ │ │ default │ │
│ │ │ │ │ │ │ is FAIL │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ exit1_p… │ script │ generic… │ None │ None │ None │ report │ /home/… │
│ │ │ │ │ │ │ exit 1 │ │
│ │ │ │ │ │ │ as PASS │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ returnc… │ script │ generic… │ None │ None │ None │ exit 2 │ /home/… │
│ │ │ │ │ │ │ failed │ │
│ │ │ │ │ │ │ since it │ │
│ │ │ │ │ │ │ failed │ │
│ │ │ │ │ │ │ to match │ │
│ │ │ │ │ │ │ returnc… │ │
│ │ │ │ │ │ │ 1 │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ returnc… │ script │ generic… │ None │ None │ None │ exit 128 │ /home/… │
│ │ │ │ │ │ │ matches │ │
│ │ │ │ │ │ │ returnc… │ │
│ │ │ │ │ │ │ 128 │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
exit1_fail/55c7b487: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/exit1_fail/55c7b487
exit1_fail/55c7b487: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/exit1_fail/55c7b487/stage
exit1_fail/55c7b487: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/exit1_fail/55c7b487/exit1_fail_build.sh
exit1_pass/00413867: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/exit1_pass/00413867
exit1_pass/00413867: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/exit1_pass/00413867/stage
exit1_pass/00413867: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/exit1_pass/00413867/exit1_pass_build.sh
returncode_list_mismatch/25d786bd: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/returncode_list_mismatch/25d786bd
returncode_list_mismatch/25d786bd: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/returncode_list_mismatch/25d786bd/stage
returncode_list_mismatch/25d786bd: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/returncode_list_mismatch/25d786bd/returncode_list_mismatch_build.sh
returncode_int_match/039b11aa: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/returncode_int_match/039b11aa
returncode_int_match/039b11aa: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/returncode_int_match/039b11aa/stage
returncode_int_match/039b11aa: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/returncode_int_match/039b11aa/returncode_int_match_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
returncode_list_mismatch/25d786bd does not have any dependencies adding test to queue
exit1_fail/55c7b487 does not have any dependencies adding test to queue
returncode_int_match/039b11aa does not have any dependencies adding test to queue
exit1_pass/00413867 does not have any dependencies adding test to queue
returncode_list_mismatch/25d786bd: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/returncode_list_mismatch/25d786bd/stage
returncode_list_mismatch/25d786bd: Running Test via command: bash --norc --noprofile -eo pipefail returncode_list_mismatch_build.sh
returncode_list_mismatch/25d786bd: Test completed in 0.005613 seconds
returncode_list_mismatch/25d786bd: Test completed with returncode: 2
returncode_list_mismatch/25d786bd: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/returncode_list_mismatch/25d786bd/returncode_list_mismatch.out
returncode_list_mismatch/25d786bd: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/returncode_list_mismatch/25d786bd/returncode_list_mismatch.err
returncode_list_mismatch/25d786bd: Checking returncode - 2 is matched in list [1, 3]
exit1_fail/55c7b487: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/exit1_fail/55c7b487/stage
exit1_fail/55c7b487: Running Test via command: bash --norc --noprofile -eo pipefail exit1_fail_build.sh
exit1_fail/55c7b487: Test completed in 0.005254 seconds
exit1_fail/55c7b487: Test completed with returncode: 1
exit1_fail/55c7b487: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/exit1_fail/55c7b487/exit1_fail.out
exit1_fail/55c7b487: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/exit1_fail/55c7b487/exit1_fail.err
returncode_int_match/039b11aa: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/returncode_int_match/039b11aa/stage
returncode_int_match/039b11aa: Running Test via command: bash --norc --noprofile -eo pipefail returncode_int_match_build.sh
returncode_int_match/039b11aa: Test completed in 0.005182 seconds
returncode_int_match/039b11aa: Test completed with returncode: 128
returncode_int_match/039b11aa: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/returncode_int_match/039b11aa/returncode_int_match.out
returncode_int_match/039b11aa: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/returncode_int_match/039b11aa/returncode_int_match.err
returncode_int_match/039b11aa: Checking returncode - 128 is matched in list [128]
exit1_pass/00413867: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/exit1_pass/00413867/stage
exit1_pass/00413867: Running Test via command: bash --norc --noprofile -eo pipefail exit1_pass_build.sh
exit1_pass/00413867: Test completed in 0.005105 seconds
exit1_pass/00413867: Test completed with returncode: 1
exit1_pass/00413867: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/exit1_pass/00413867/exit1_pass.out
exit1_pass/00413867: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/pass_returncode/exit1_pass/00413867/exit1_pass.err
exit1_pass/00413867: Checking returncode - 1 is matched in list [1]
In this iteration we are going to run the following tests: [returncode_list_mismatch/25d786bd, exit1_fail/55c7b487, returncode_int_match/039b11aa, exit1_pass/00413867]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ returncode_l │ generic.loc… │ FAIL │ False None │ 2 │ 0.005613 │
│ ist_mismatch │ │ │ None │ │ │
│ /25d786bd │ │ │ │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ exit1_fail/5 │ generic.loc… │ FAIL │ None None │ 1 │ 0.005254 │
│ 5c7b487 │ │ │ None │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ exit1_pass/0 │ generic.loc… │ PASS │ True None │ 1 │ 0.005105 │
│ 0413867 │ │ │ None │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ returncode_i │ generic.loc… │ PASS │ True None │ 128 │ 0.005182 │
│ nt_match/039 │ │ │ None │ │ │
│ b11aa │ │ │ │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 2/4 Percentage: 50.000%
Failed Tests: 2/4 Percentage: 50.000%
Adding 4 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_t6cud6r0.log
The returncode
field can be an integer or list of integers but it may not accept
duplicate values. If you specify a list of exit codes, buildtest will check actual returncode
with list of expected returncodes specified by returncode field.
Shown below are examples of invalid returncodes:
# empty list is not allowed
returncode: []
# floating point is not accepted in list
returncode: [1, 1.5]
# floating point not accepted
returncode: 1.5
# duplicates are not allowed
returncode: [1, 2, 5, 5]
Passing Test based on regular expression¶
buildtest can configure PASS/FAIL of test based on regular expression on output or error file. This can be useful if you are expecting a certain output from the test as pose to returncode check.
In this example we introduce, the regex
field which is part of status that expects
a regular expression via exp
. The stream
property must be stdout or stderr which indicates
buildtest will read output or error file and apply regular expression. If there is a match, buildtest will record the
test state as PASS otherwise it will be a FAIL. In this example, we have two tests that will apply regular expression
on output file.
buildspecs:
status_regex_pass:
executor: generic.local.bash
type: script
tags: [system]
description: Pass test based on regular expression
run: echo "PASS"
status:
regex:
stream: stdout
exp: "^(PASS)$"
status_regex_fail:
executor: generic.local.bash
type: script
tags: [system]
description: Pass test based on regular expression
run: echo "FAIL"
status:
regex:
stream: stdout
exp: "^(123FAIL)$"
Now if we run this test, we will see first test will pass while second one will fail even though the returncode is a 0. Take a close look at the status property
buildtest build -b tutorials/test_status/status_regex.yml
$ buildtest build -b tutorials/test_status/status_regex.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:34 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/status_regex.yml: VALID
Total builder objects created: 2
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ status_… │ script │ generic… │ None │ None │ None │ Pass │ /home/… │
│ │ │ │ │ │ │ test │ │
│ │ │ │ │ │ │ based on │ │
│ │ │ │ │ │ │ regular │ │
│ │ │ │ │ │ │ express… │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ status_… │ script │ generic… │ None │ None │ None │ Pass │ /home/… │
│ │ │ │ │ │ │ test │ │
│ │ │ │ │ │ │ based on │ │
│ │ │ │ │ │ │ regular │ │
│ │ │ │ │ │ │ express… │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
status_regex_pass/42285047: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_pass/42285047
status_regex_pass/42285047: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_pass/42285047/stage
status_regex_pass/42285047: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_pass/42285047/status_regex_pass_build.sh
status_regex_fail/c2cc2a00: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_fail/c2cc2a00
status_regex_fail/c2cc2a00: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_fail/c2cc2a00/stage
status_regex_fail/c2cc2a00: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_fail/c2cc2a00/status_regex_fail_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
status_regex_pass/42285047 does not have any dependencies adding test to queue
status_regex_fail/c2cc2a00 does not have any dependencies adding test to queue
status_regex_pass/42285047: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_pass/42285047/stage
status_regex_pass/42285047: Running Test via command: bash --norc --noprofile -eo pipefail status_regex_pass_build.sh
status_regex_pass/42285047: Test completed in 0.005711 seconds
status_regex_pass/42285047: Test completed with returncode: 0
status_regex_pass/42285047: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_pass/42285047/status_regex_pass.out
status_regex_pass/42285047: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_pass/42285047/status_regex_pass.err
status_regex_pass/42285047: performing regular expression - '^(PASS)$' on file: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_pass/42285047/status_regex_pass.out
status_regex_pass/42285047: Regular Expression Match - Success!
status_regex_fail/c2cc2a00: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_fail/c2cc2a00/stage
status_regex_fail/c2cc2a00: Running Test via command: bash --norc --noprofile -eo pipefail status_regex_fail_build.sh
status_regex_fail/c2cc2a00: Test completed in 0.005519 seconds
status_regex_fail/c2cc2a00: Test completed with returncode: 0
status_regex_fail/c2cc2a00: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_fail/c2cc2a00/status_regex_fail.out
status_regex_fail/c2cc2a00: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_fail/c2cc2a00/status_regex_fail.err
status_regex_fail/c2cc2a00: performing regular expression - '^(123FAIL)$' on file: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/status_regex/status_regex_fail/c2cc2a00/status_regex_fail.out
status_regex_fail/c2cc2a00: Regular Expression Match - Failed!
In this iteration we are going to run the following tests: [status_regex_pass/42285047, status_regex_fail/c2cc2a00]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ status_regex │ generic.loc… │ FAIL │ None False │ 0 │ 0.005519 │
│ _fail/c2cc2a │ │ │ None │ │ │
│ 00 │ │ │ │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ status_regex │ generic.loc… │ PASS │ None True │ 0 │ 0.005711 │
│ _pass/422850 │ │ │ None │ │ │
│ 47 │ │ │ │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 1/2 Percentage: 50.000%
Failed Tests: 1/2 Percentage: 50.000%
Adding 2 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest__gz78saj.log
Specify Regular Expression on arbitrary filenames¶
In the previous example, we applied regular expression on output or error file; however, you may want to apply
regular expression on arbitrary files. This can be done by specifying file_regex
property. The file_regex
property is
an array of assertions, where each assertion must have filename
and exp
property. The filename
property is the path
to filename and exp
is the regular expression you want to apply.
In this example, we have three tests that make use of file_regex
property. The first test will perform a regular expression
on multiple file names. The second test will attempt to check on a directory name which is not supported since regular expression must
be applied to file name. The third test will show that variable expansion and environment variable expansion is supported.
buildspecs:
regex_on_multiple_files:
type: script
executor: generic.local.bash
description: Test regex on multiple files
run: |
echo "Hello" > hello.txt
buildtest --help > buildtest_help.txt
status:
file_regex:
- file: hello.txt
exp: '^(Hello)$'
- file: buildtest_help.txt
exp: '^(usage: buildtest)'
regex_on_directory_not_supported:
type: script
executor: generic.local.bash
description: Test regex on directory is not supported
run: |
mkdir -p hello
echo "Hello" > hello/hello.txt
status:
file_regex:
- file: hello
exp: '^(Hello)$'
file_expansion_supported:
type: script
executor: generic.local.bash
description: Test regex with variable and shell expansion
run: |
echo "Hello" > $BUILDTEST_ROOT/hello.txt
echo "Hello" > $HOME/hello.txt
status:
file_regex:
- file: $BUILDTEST_ROOT/hello.txt
exp: '^(Hello)$'
- file: ~/hello.txt
exp: '^(Hello)$'
We can build this test by running the following command:
buildtest build -b tutorials/test_status/regex_on_filename.yml
$ buildtest build -b tutorials/test_status/regex_on_filename.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:35 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/regex_on_filename.yml: VALID
Total builder objects created: 3
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ regex_o… │ script │ generic… │ None │ None │ None │ Test │ /home/… │
│ │ │ │ │ │ │ regex on │ │
│ │ │ │ │ │ │ multiple │ │
│ │ │ │ │ │ │ files │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ regex_o… │ script │ generic… │ None │ None │ None │ Test │ /home/… │
│ │ │ │ │ │ │ regex on │ │
│ │ │ │ │ │ │ directo… │ │
│ │ │ │ │ │ │ is not │ │
│ │ │ │ │ │ │ support… │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ file_ex… │ script │ generic… │ None │ None │ None │ Test │ /home/… │
│ │ │ │ │ │ │ regex │ │
│ │ │ │ │ │ │ with │ │
│ │ │ │ │ │ │ variable │ │
│ │ │ │ │ │ │ and │ │
│ │ │ │ │ │ │ shell │ │
│ │ │ │ │ │ │ expansi… │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
regex_on_multiple_files/64ce0ff9: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_multiple_files/64ce0ff9
regex_on_multiple_files/64ce0ff9: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_multiple_files/64ce0ff9/stage
regex_on_multiple_files/64ce0ff9: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_multiple_files/64ce0ff9/regex_on_multiple_files_build.sh
regex_on_directory_not_supported/abfef9c8: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_directory_not_supported/abfef9c8
regex_on_directory_not_supported/abfef9c8: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_directory_not_supported/abfef9c8/stage
regex_on_directory_not_supported/abfef9c8: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_directory_not_supported/abfef9c8/regex_on_directory_not_supported_build.sh
file_expansion_supported/3d78560f: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/file_expansion_supported/3d78560f
file_expansion_supported/3d78560f: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/file_expansion_supported/3d78560f/stage
file_expansion_supported/3d78560f: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/file_expansion_supported/3d78560f/file_expansion_supported_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
regex_on_multiple_files/64ce0ff9 does not have any dependencies adding test to queue
file_expansion_supported/3d78560f does not have any dependencies adding test to queue
regex_on_directory_not_supported/abfef9c8 does not have any dependencies adding test to queue
regex_on_multiple_files/64ce0ff9: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_multiple_files/64ce0ff9/stage
regex_on_multiple_files/64ce0ff9: Running Test via command: bash --norc --noprofile -eo pipefail regex_on_multiple_files_build.sh
regex_on_multiple_files/64ce0ff9: Test completed in 0.463162 seconds
regex_on_multiple_files/64ce0ff9: Test completed with returncode: 0
regex_on_multiple_files/64ce0ff9: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_multiple_files/64ce0ff9/regex_on_multiple_files.out
regex_on_multiple_files/64ce0ff9: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_multiple_files/64ce0ff9/regex_on_multiple_files.err
regex_on_multiple_files/64ce0ff9: Performing regex expression '^(Hello)$' on file /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_multiple_files/64ce0ff9/stage/hello.txt
regex_on_multiple_files/64ce0ff9: Regular expression on file /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_multiple_files/64ce0ff9/stage/hello.txt is a MATCH!
regex_on_multiple_files/64ce0ff9: Performing regex expression '^(usage: buildtest)' on file /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_multiple_files/64ce0ff9/stage/buildtest_help.txt
regex_on_multiple_files/64ce0ff9: Regular expression on file /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_multiple_files/64ce0ff9/stage/buildtest_help.txt is a MATCH!
file_expansion_supported/3d78560f: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/file_expansion_supported/3d78560f/stage
file_expansion_supported/3d78560f: Running Test via command: bash --norc --noprofile -eo pipefail file_expansion_supported_build.sh
file_expansion_supported/3d78560f: Test completed in 0.005889 seconds
file_expansion_supported/3d78560f: Test completed with returncode: 0
file_expansion_supported/3d78560f: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/file_expansion_supported/3d78560f/file_expansion_supported.out
file_expansion_supported/3d78560f: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/file_expansion_supported/3d78560f/file_expansion_supported.err
file_expansion_supported/3d78560f: Performing regex expression '^(Hello)$' on file /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/hello.txt
file_expansion_supported/3d78560f: Regular expression on file /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/hello.txt is a MATCH!
file_expansion_supported/3d78560f: Performing regex expression '^(Hello)$' on file /home/docs/hello.txt
file_expansion_supported/3d78560f: Regular expression on file /home/docs/hello.txt is a MATCH!
regex_on_directory_not_supported/abfef9c8: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_directory_not_supported/abfef9c8/stage
regex_on_directory_not_supported/abfef9c8: Running Test via command: bash --norc --noprofile -eo pipefail regex_on_directory_not_supported_build.sh
regex_on_directory_not_supported/abfef9c8: Test completed in 0.006594 seconds
regex_on_directory_not_supported/abfef9c8: Test completed with returncode: 0
regex_on_directory_not_supported/abfef9c8: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_directory_not_supported/abfef9c8/regex_on_directory_not_supported.out
regex_on_directory_not_supported/abfef9c8: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_directory_not_supported/abfef9c8/regex_on_directory_not_supported.err
regex_on_directory_not_supported/abfef9c8: File: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/regex_on_filename/regex_on_directory_not_supported/abfef9c8/stage/hello is not a file
In this iteration we are going to run the following tests: [regex_on_multiple_files/64ce0ff9, file_expansion_supported/3d78560f, regex_on_directory_not_supported/abfef9c8]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ regex_on_dir │ generic.loc… │ FAIL │ None None │ 0 │ 0.006594 │
│ ectory_not_s │ │ │ None │ │ │
│ upported/abf │ │ │ │ │ │
│ ef9c8 │ │ │ │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ regex_on_mul │ generic.loc… │ PASS │ None None │ 0 │ 0.463162 │
│ tiple_files/ │ │ │ None │ │ │
│ 64ce0ff9 │ │ │ │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ file_expansi │ generic.loc… │ PASS │ None None │ 0 │ 0.005889 │
│ on_supported │ │ │ None │ │ │
│ /3d78560f │ │ │ │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 2/3 Percentage: 66.667%
Failed Tests: 1/3 Percentage: 33.333%
Adding 3 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_vq0uhr5b.log
Passing Test based on runtime¶
buildtest can determine state of test based on runtime property which is part of
status
object. This can be used if you want to control how test PASS or FAIL based on
execution time of test. In example below we have five tests that make use of runtime property
for passing a test. The runtime property support min
and max
property that can mark test
pass based on minimum and maximum runtime. A test will pass if it’s execution time is greater than min
time and less than max
time. If min is specified without max property the upperbound is not set, likewise
max without min will pass if test is less than max time. The lower bound is not set, but test runtime
will be greater than 0 sec.
In test timelimit_min, we sleep for 2 seconds and it will pass because minimum runtime is 1.0 seconds. Similarly, timelimit_max will pass because we sleep for 2 seconds with a max time of 5.0.
buildspecs:
timelimit_min_max:
type: script
executor: generic.local.sh
description: "Run a sleep job for 2 seconds and test pass if its within 1.0-3.0sec"
tags: ["tutorials"]
run: sleep 2
status:
runtime:
min: 1.0
max: 3.0
timelimit_min:
type: script
executor: generic.local.sh
description: "Run a sleep job for 2 seconds and test pass if its exceeds min time of 1.0 sec"
tags: ["tutorials"]
run: sleep 2
status:
runtime:
min: 1.0
timelimit_max:
type: script
executor: generic.local.sh
description: "Run a sleep job for 2 seconds and test pass if it's within max time: 5.0 sec"
tags: ["tutorials"]
run: sleep 2
status:
runtime:
max: 5.0
timelimit_min_fail:
type: script
executor: generic.local.sh
description: "This test fails because it runs less than mintime of 10 second"
tags: ["tutorials"]
run: sleep 2
status:
runtime:
min: 10.0
timelimit_max_fail:
type: script
executor: generic.local.sh
description: "This test fails because it exceeds maxtime of 1.0 second"
tags: ["tutorials"]
run: sleep 3
status:
runtime:
max: 1.0
buildtest build -b tutorials/test_status/runtime_status_test.yml
$ buildtest build -b tutorials/test_status/runtime_status_test.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:36 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/runtime_status_test.yml: VALID
Total builder objects created: 5
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ timelim… │ script │ generic… │ None │ None │ None │ Run a │ /home/… │
│ │ │ │ │ │ │ sleep │ │
│ │ │ │ │ │ │ job for │ │
│ │ │ │ │ │ │ 2 │ │
│ │ │ │ │ │ │ seconds │ │
│ │ │ │ │ │ │ and test │ │
│ │ │ │ │ │ │ pass if │ │
│ │ │ │ │ │ │ its │ │
│ │ │ │ │ │ │ within │ │
│ │ │ │ │ │ │ 1.0-3.0… │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ timelim… │ script │ generic… │ None │ None │ None │ Run a │ /home/… │
│ │ │ │ │ │ │ sleep │ │
│ │ │ │ │ │ │ job for │ │
│ │ │ │ │ │ │ 2 │ │
│ │ │ │ │ │ │ seconds │ │
│ │ │ │ │ │ │ and test │ │
│ │ │ │ │ │ │ pass if │ │
│ │ │ │ │ │ │ its │ │
│ │ │ │ │ │ │ exceeds │ │
│ │ │ │ │ │ │ min time │ │
│ │ │ │ │ │ │ of 1.0 │ │
│ │ │ │ │ │ │ sec │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ timelim… │ script │ generic… │ None │ None │ None │ Run a │ /home/… │
│ │ │ │ │ │ │ sleep │ │
│ │ │ │ │ │ │ job for │ │
│ │ │ │ │ │ │ 2 │ │
│ │ │ │ │ │ │ seconds │ │
│ │ │ │ │ │ │ and test │ │
│ │ │ │ │ │ │ pass if │ │
│ │ │ │ │ │ │ it's │ │
│ │ │ │ │ │ │ within │ │
│ │ │ │ │ │ │ max │ │
│ │ │ │ │ │ │ time: │ │
│ │ │ │ │ │ │ 5.0 sec │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ timelim… │ script │ generic… │ None │ None │ None │ This │ /home/… │
│ │ │ │ │ │ │ test │ │
│ │ │ │ │ │ │ fails │ │
│ │ │ │ │ │ │ because │ │
│ │ │ │ │ │ │ it runs │ │
│ │ │ │ │ │ │ less │ │
│ │ │ │ │ │ │ than │ │
│ │ │ │ │ │ │ mintime │ │
│ │ │ │ │ │ │ of 10 │ │
│ │ │ │ │ │ │ second │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ timelim… │ script │ generic… │ None │ None │ None │ This │ /home/… │
│ │ │ │ │ │ │ test │ │
│ │ │ │ │ │ │ fails │ │
│ │ │ │ │ │ │ because │ │
│ │ │ │ │ │ │ it │ │
│ │ │ │ │ │ │ exceeds │ │
│ │ │ │ │ │ │ maxtime │ │
│ │ │ │ │ │ │ of 1.0 │ │
│ │ │ │ │ │ │ second │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
timelimit_min_max/4fa0404a: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min_max/4fa0404a
timelimit_min_max/4fa0404a: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min_max/4fa0404a/stage
timelimit_min_max/4fa0404a: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min_max/4fa0404a/timelimit_min_max_build.sh
timelimit_min/ca275534: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min/ca275534
timelimit_min/ca275534: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min/ca275534/stage
timelimit_min/ca275534: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min/ca275534/timelimit_min_build.sh
timelimit_max/7ec41035: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_max/7ec41035
timelimit_max/7ec41035: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_max/7ec41035/stage
timelimit_max/7ec41035: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_max/7ec41035/timelimit_max_build.sh
timelimit_min_fail/3600a6c1: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min_fail/3600a6c1
timelimit_min_fail/3600a6c1: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min_fail/3600a6c1/stage
timelimit_min_fail/3600a6c1: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min_fail/3600a6c1/timelimit_min_fail_build.sh
timelimit_max_fail/f6a94601: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_max_fail/f6a94601
timelimit_max_fail/f6a94601: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_max_fail/f6a94601/stage
timelimit_max_fail/f6a94601: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_max_fail/f6a94601/timelimit_max_fail_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
timelimit_min_fail/3600a6c1 does not have any dependencies adding test to queue
timelimit_min_max/4fa0404a does not have any dependencies adding test to queue
timelimit_max/7ec41035 does not have any dependencies adding test to queue
timelimit_max_fail/f6a94601 does not have any dependencies adding test to queue
timelimit_min/ca275534 does not have any dependencies adding test to queue
timelimit_min_fail/3600a6c1: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min_fail/3600a6c1/stage
timelimit_min_fail/3600a6c1: Running Test via command: sh --norc --noprofile -eo pipefail timelimit_min_fail_build.sh
timelimit_min_fail/3600a6c1: Test completed in 0.003304 seconds
timelimit_min_fail/3600a6c1: Test completed with returncode: 2
timelimit_min_fail/3600a6c1: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min_fail/3600a6c1/timelimit_min_fail.out
timelimit_min_fail/3600a6c1: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min_fail/3600a6c1/timelimit_min_fail.err
timelimit_min_fail/3600a6c1: Checking mintime < runtime: 10.0 < 0.003304
timelimit_min_max/4fa0404a: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min_max/4fa0404a/stage
timelimit_min_max/4fa0404a: Running Test via command: sh --norc --noprofile -eo pipefail timelimit_min_max_build.sh
timelimit_min_max/4fa0404a: Test completed in 0.003073 seconds
timelimit_min_max/4fa0404a: Test completed with returncode: 2
timelimit_min_max/4fa0404a: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min_max/4fa0404a/timelimit_min_max.out
timelimit_min_max/4fa0404a: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min_max/4fa0404a/timelimit_min_max.err
timelimit_min_max/4fa0404a: Checking mintime < runtime < maxtime: 1.0 < 0.003073 < 3.0
timelimit_max/7ec41035: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_max/7ec41035/stage
timelimit_max/7ec41035: Running Test via command: sh --norc --noprofile -eo pipefail timelimit_max_build.sh
timelimit_max/7ec41035: Test completed in 0.003115 seconds
timelimit_max/7ec41035: Test completed with returncode: 2
timelimit_max/7ec41035: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_max/7ec41035/timelimit_max.out
timelimit_max/7ec41035: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_max/7ec41035/timelimit_max.err
timelimit_max/7ec41035: Checking runtime < maxtime: 0.003115 < 5.0
timelimit_max_fail/f6a94601: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_max_fail/f6a94601/stage
timelimit_max_fail/f6a94601: Running Test via command: sh --norc --noprofile -eo pipefail timelimit_max_fail_build.sh
timelimit_max_fail/f6a94601: Test completed in 0.003132 seconds
timelimit_max_fail/f6a94601: Test completed with returncode: 2
timelimit_max_fail/f6a94601: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_max_fail/f6a94601/timelimit_max_fail.out
timelimit_max_fail/f6a94601: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_max_fail/f6a94601/timelimit_max_fail.err
timelimit_max_fail/f6a94601: Checking runtime < maxtime: 0.003132 < 1.0
timelimit_min/ca275534: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min/ca275534/stage
timelimit_min/ca275534: Running Test via command: sh --norc --noprofile -eo pipefail timelimit_min_build.sh
timelimit_min/ca275534: Test completed in 0.00302 seconds
timelimit_min/ca275534: Test completed with returncode: 2
timelimit_min/ca275534: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min/ca275534/timelimit_min.out
timelimit_min/ca275534: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/runtime_status_test/timelimit_min/ca275534/timelimit_min.err
timelimit_min/ca275534: Checking mintime < runtime: 1.0 < 0.00302
In this iteration we are going to run the following tests: [timelimit_min_fail/3600a6c1, timelimit_min_max/4fa0404a, timelimit_max/7ec41035, timelimit_max_fail/f6a94601, timelimit_min/ca275534]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ timelimit_mi │ generic.loc… │ FAIL │ None None │ 2 │ 0.003073 │
│ n_max/4fa040 │ │ │ False │ │ │
│ 4a │ │ │ │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ timelimit_ma │ generic.loc… │ PASS │ None None │ 2 │ 0.003132 │
│ x_fail/f6a94 │ │ │ True │ │ │
│ 601 │ │ │ │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ timelimit_mi │ generic.loc… │ FAIL │ None None │ 2 │ 0.003304 │
│ n_fail/3600a │ │ │ False │ │ │
│ 6c1 │ │ │ │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ timelimit_ma │ generic.loc… │ PASS │ None None │ 2 │ 0.003115 │
│ x/7ec41035 │ │ │ True │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ timelimit_mi │ generic.loc… │ FAIL │ None None │ 2 │ 0.00302 │
│ n/ca275534 │ │ │ False │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 2/5 Percentage: 40.000%
Failed Tests: 3/5 Percentage: 60.000%
Adding 5 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_5_4i9f9j.log
If we look at the test results, we expect the first three tests timelimit_min, timelimit_max, timelimit_min_max will pass while the last two tests fail because it fails to comply with runtime property.
buildtest report --filter buildspec=tutorials/test_status/runtime_status_test.yml --format name,id,state,runtime --latest
$ buildtest report --filter buildspec=tutorials/test_status/runtime_status_test.yml --format name,id,state,runtime --latest
Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ name ┃ id ┃ state ┃ runtime ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ timelimit_min_max │ 4fa0404a │ FAIL │ 0.003073 │
├────────────────────────────────┼────────────────┼────────────┼───────────────┤
│ timelimit_max_fail │ f6a94601 │ PASS │ 0.003132 │
├────────────────────────────────┼────────────────┼────────────┼───────────────┤
│ timelimit_min_fail │ 3600a6c1 │ FAIL │ 0.003304 │
├────────────────────────────────┼────────────────┼────────────┼───────────────┤
│ timelimit_max │ 7ec41035 │ PASS │ 0.003115 │
├────────────────────────────────┼────────────────┼────────────┼───────────────┤
│ timelimit_min │ ca275534 │ FAIL │ 0.00302 │
└────────────────────────────────┴────────────────┴────────────┴───────────────┘
Explicitly Declaring Status of Test¶
You can explicitly define status of test regardless of what buildtest does for checking status of test. This
can be useful if you want to explicitly mark a test as PASS or FAIL regardless of how test behaves. This can be done via
state
property which expects one of two types PASS or FAIL. If state
property is specified, buildtest will ignore any checks
including returncode, regex, or runtime match.
In this next example we will demonstrate how one can use state
property for marking test state. In this
example we have four tests. The first test always_pass
will PASS even though we have a non-zero returncode. The
second test always_fail
will FAIL even though it has a 0 returncode. The last two test demonstrate how one
can define state regardless of what is specified for returncode match. buildtest will honor the state
property even if
their is a match on the returncode.
buildspecs:
always_pass:
type: script
executor: 'generic.local.sh'
description: This test will always 'PASS'
run: exit 1
status:
state: PASS
always_fail:
type: script
executor: 'generic.local.sh'
description: This test will always 'FAIL'
run: exit 0
status:
state: FAIL
test_fail_returncode_match:
type: script
executor: 'generic.local.sh'
description: This test will 'FAIL' even if we have returncode match
run: exit 1
status:
state: FAIL
returncode: 1
test_pass_returncode_mismatch:
type: script
executor: 'generic.local.sh'
description: This test will 'PASS' even if we have returncode mismatch
run: exit 1
status:
state: PASS
returncode: 2
If we build this test, we expect buildtest to honor the value of state
property
buildtest build -b tutorials/test_status/explicit_state.yml
$ buildtest build -b tutorials/test_status/explicit_state.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:37 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/explicit_state.yml: VALID
Total builder objects created: 4
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ always_… │ script │ generic… │ None │ None │ None │ This │ /home/… │
│ │ │ │ │ │ │ test │ │
│ │ │ │ │ │ │ will │ │
│ │ │ │ │ │ │ always │ │
│ │ │ │ │ │ │ 'PASS' │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ always_… │ script │ generic… │ None │ None │ None │ This │ /home/… │
│ │ │ │ │ │ │ test │ │
│ │ │ │ │ │ │ will │ │
│ │ │ │ │ │ │ always │ │
│ │ │ │ │ │ │ 'FAIL' │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ test_fa… │ script │ generic… │ None │ None │ None │ This │ /home/… │
│ │ │ │ │ │ │ test │ │
│ │ │ │ │ │ │ will │ │
│ │ │ │ │ │ │ 'FAIL' │ │
│ │ │ │ │ │ │ even if │ │
│ │ │ │ │ │ │ we have │ │
│ │ │ │ │ │ │ returnc… │ │
│ │ │ │ │ │ │ match │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ test_pa… │ script │ generic… │ None │ None │ None │ This │ /home/… │
│ │ │ │ │ │ │ test │ │
│ │ │ │ │ │ │ will │ │
│ │ │ │ │ │ │ 'PASS' │ │
│ │ │ │ │ │ │ even if │ │
│ │ │ │ │ │ │ we have │ │
│ │ │ │ │ │ │ returnc… │ │
│ │ │ │ │ │ │ mismatch │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
always_pass/4c37ed3d: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/always_pass/4c37ed3d
always_pass/4c37ed3d: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/always_pass/4c37ed3d/stage
always_pass/4c37ed3d: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/always_pass/4c37ed3d/always_pass_build.sh
always_fail/cd24ad48: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/always_fail/cd24ad48
always_fail/cd24ad48: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/always_fail/cd24ad48/stage
always_fail/cd24ad48: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/always_fail/cd24ad48/always_fail_build.sh
test_fail_returncode_match/0a6bec00: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/test_fail_returncode_match/0a6bec00
test_fail_returncode_match/0a6bec00: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/test_fail_returncode_match/0a6bec00/stage
test_fail_returncode_match/0a6bec00: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/test_fail_returncode_match/0a6bec00/test_fail_returncode_match_build.sh
test_pass_returncode_mismatch/74b01620: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/test_pass_returncode_mismatch/74b01620
test_pass_returncode_mismatch/74b01620: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/test_pass_returncode_mismatch/74b01620/stage
test_pass_returncode_mismatch/74b01620: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/test_pass_returncode_mismatch/74b01620/test_pass_returncode_mismatch_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
test_fail_returncode_match/0a6bec00 does not have any dependencies adding test to queue
always_fail/cd24ad48 does not have any dependencies adding test to queue
test_pass_returncode_mismatch/74b01620 does not have any dependencies adding test to queue
always_pass/4c37ed3d does not have any dependencies adding test to queue
test_fail_returncode_match/0a6bec00: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/test_fail_returncode_match/0a6bec00/stage
test_fail_returncode_match/0a6bec00: Running Test via command: sh --norc --noprofile -eo pipefail test_fail_returncode_match_build.sh
test_fail_returncode_match/0a6bec00: Test completed in 0.003307 seconds
test_fail_returncode_match/0a6bec00: Test completed with returncode: 2
test_fail_returncode_match/0a6bec00: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/test_fail_returncode_match/0a6bec00/test_fail_returncode_match.out
test_fail_returncode_match/0a6bec00: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/test_fail_returncode_match/0a6bec00/test_fail_returncode_match.err
always_pass/4c37ed3d: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/always_pass/4c37ed3d/stage
always_pass/4c37ed3d: Running Test via command: sh --norc --noprofile -eo pipefail always_pass_build.sh
always_pass/4c37ed3d: Test completed in 0.003103 seconds
always_pass/4c37ed3d: Test completed with returncode: 2
always_pass/4c37ed3d: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/always_pass/4c37ed3d/always_pass.out
always_pass/4c37ed3d: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/always_pass/4c37ed3d/always_pass.err
test_pass_returncode_mismatch/74b01620: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/test_pass_returncode_mismatch/74b01620/stage
test_pass_returncode_mismatch/74b01620: Running Test via command: sh --norc --noprofile -eo pipefail test_pass_returncode_mismatch_build.sh
test_pass_returncode_mismatch/74b01620: Test completed in 0.003289 seconds
test_pass_returncode_mismatch/74b01620: Test completed with returncode: 2
test_pass_returncode_mismatch/74b01620: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/test_pass_returncode_mismatch/74b01620/test_pass_returncode_mismatch.out
test_pass_returncode_mismatch/74b01620: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/test_pass_returncode_mismatch/74b01620/test_pass_returncode_mismatch.err
always_fail/cd24ad48: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/always_fail/cd24ad48/stage
always_fail/cd24ad48: Running Test via command: sh --norc --noprofile -eo pipefail always_fail_build.sh
always_fail/cd24ad48: Test completed in 0.003118 seconds
always_fail/cd24ad48: Test completed with returncode: 2
always_fail/cd24ad48: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/always_fail/cd24ad48/always_fail.out
always_fail/cd24ad48: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.sh/explicit_state/always_fail/cd24ad48/always_fail.err
In this iteration we are going to run the following tests: [test_fail_returncode_match/0a6bec00, always_pass/4c37ed3d, test_pass_returncode_mismatch/74b01620, always_fail/cd24ad48]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ test_fail_re │ generic.loc… │ FAIL │ None None │ 2 │ 0.003307 │
│ turncode_mat │ │ │ None │ │ │
│ ch/0a6bec00 │ │ │ │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ always_pass/ │ generic.loc… │ PASS │ None None │ 2 │ 0.003103 │
│ 4c37ed3d │ │ │ None │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ always_fail/ │ generic.loc… │ FAIL │ None None │ 2 │ 0.003118 │
│ cd24ad48 │ │ │ None │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ test_pass_re │ generic.loc… │ PASS │ None None │ 2 │ 0.003289 │
│ turncode_mis │ │ │ None │ │ │
│ match/74b016 │ │ │ │ │ │
│ 20 │ │ │ │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 2/4 Percentage: 50.000%
Failed Tests: 2/4 Percentage: 50.000%
Adding 4 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_cqph3hr0.log
File Checks¶
buildtest supports various file checks that can be used as means for passing test. This can include checking for File Existence, File and Directory Checks, Symbolic Link Check, and File Count.
File Existence¶
For instance, if you want to check for file existence, you can use exists
property
which expects a list of file or directory names to check. This can be useful if your test
will write some output file or directory and test will pass based on existence of file/directory.
In the example below we have two tests, first test will pass, where all files exist. We check for files and directory path, note variable and shell expansion is supported.
In the second example, we expect this test to fail because filename bar does not exist.
buildspecs:
status_exists:
type: script
executor: generic.local.bash
description: status check based for file and directory
run: |
mkdir -p $HOME/dirA
mkdir -p /tmp/ABC
touch file1
status:
exists:
- $HOME/dirA
- ~/.bashrc
- /tmp/ABC
- file1
status_exists_failure:
type: script
executor: generic.local.bash
description: status check failure for existence
run: touch foo
status:
exists:
- bar
We can run this test by running the following, take note of the output.
buildtest build -b tutorials/test_status/exists.yml
$ buildtest build -b tutorials/test_status/exists.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:38 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/exists.yml: VALID
Total builder objects created: 2
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ status_… │ script │ generic… │ None │ None │ None │ status │ /home/… │
│ │ │ │ │ │ │ check │ │
│ │ │ │ │ │ │ based │ │
│ │ │ │ │ │ │ for file │ │
│ │ │ │ │ │ │ and │ │
│ │ │ │ │ │ │ directo… │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ status_… │ script │ generic… │ None │ None │ None │ status │ /home/… │
│ │ │ │ │ │ │ check │ │
│ │ │ │ │ │ │ failure │ │
│ │ │ │ │ │ │ for │ │
│ │ │ │ │ │ │ existen… │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
status_exists/2d2bf867: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists/2d2bf867
status_exists/2d2bf867: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists/2d2bf867/stage
status_exists/2d2bf867: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists/2d2bf867/status_exists_build.sh
status_exists_failure/1c186484: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists_failure/1c186484
status_exists_failure/1c186484: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists_failure/1c186484/stage
status_exists_failure/1c186484: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists_failure/1c186484/status_exists_failure_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
status_exists_failure/1c186484 does not have any dependencies adding test to queue
status_exists/2d2bf867 does not have any dependencies adding test to queue
status_exists_failure/1c186484: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists_failure/1c186484/stage
status_exists_failure/1c186484: Running Test via command: bash --norc --noprofile -eo pipefail status_exists_failure_build.sh
status_exists_failure/1c186484: Test completed in 0.006732 seconds
status_exists_failure/1c186484: Test completed with returncode: 0
status_exists_failure/1c186484: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists_failure/1c186484/status_exists_failure.out
status_exists_failure/1c186484: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists_failure/1c186484/status_exists_failure.err
status_exists_failure/1c186484: Test all files: ['bar'] existences
status_exists_failure/1c186484: file: bar does not exist
status_exists_failure/1c186484: Exist Check: False
status_exists/2d2bf867: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists/2d2bf867/stage
status_exists/2d2bf867: Running Test via command: bash --norc --noprofile -eo pipefail status_exists_build.sh
status_exists/2d2bf867: Test completed in 0.008649 seconds
status_exists/2d2bf867: Test completed with returncode: 0
status_exists/2d2bf867: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists/2d2bf867/status_exists.out
status_exists/2d2bf867: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists/2d2bf867/status_exists.err
status_exists/2d2bf867: Test all files: ['$HOME/dirA', '~/.bashrc', '/tmp/ABC', 'file1'] existences
status_exists/2d2bf867: file: /home/docs/dirA exists
status_exists/2d2bf867: file: /home/docs/.bashrc exists
status_exists/2d2bf867: file: /tmp/ABC exists
status_exists/2d2bf867: file: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/exists/status_exists/2d2bf867/stage/file1 exists
status_exists/2d2bf867: Exist Check: True
In this iteration we are going to run the following tests: [status_exists_failure/1c186484, status_exists/2d2bf867]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ status_exist │ generic.loc… │ PASS │ None None │ 0 │ 0.008649 │
│ s/2d2bf867 │ │ │ None │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ status_exist │ generic.loc… │ FAIL │ None None │ 0 │ 0.006732 │
│ s_failure/1c │ │ │ None │ │ │
│ 186484 │ │ │ │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 1/2 Percentage: 50.000%
Failed Tests: 1/2 Percentage: 50.000%
Adding 2 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_m_vqktle.log
Each item in the exists
field must be a string, which can lead to issue in example
below let’s assume we want a test to pass based on a directory name 1, if we specify
as follows, this test will fail validation.
buildspecs:
file_exists_failure:
type: script
executor: generic.local.bash
description: this test will fail validation, because item must be a string
run: mkdir -p 1
status:
exists: [1]
We can validate this buildspec by running the following
buildtest bc validate -b tutorials/test_status/file_exists_exception.yml
$ buildtest bc validate -b tutorials/test_status/file_exists_exception.yml ─ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ─ 1 is not of type 'string' Failed validating 'type' in schema['properties']['status']['properties']['exists']['items']: {'type': 'string'} On instance['status']['exists'][0]: 1 1 buildspecs failed to validate
In order to run this test, we need to enclose each item in quotes. Shown below is the same test with quotations.
buildspecs:
file_exists_pass:
type: script
executor: generic.local.bash
description: this test will pass
run: mkdir -p 1
status:
exists: [ '1' ]
Let’s validate and build this test.
buildtest bc validate -b tutorials/test_status/file_exists_with_number.yml
$ buildtest bc validate -b tutorials/test_status/file_exists_with_number.yml
buildspec: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/file_exists_with_number.yml is valid
All buildspecs passed validation!!!
buildtest build -b tutorials/test_status/file_exists_with_number.yml
$ buildtest build -b tutorials/test_status/file_exists_with_number.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:39 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/file_exists_with_number.yml: VALID
Total builder objects created: 1
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ file_ex… │ script │ generic… │ None │ None │ None │ this │ /home/… │
│ │ │ │ │ │ │ test │ │
│ │ │ │ │ │ │ will │ │
│ │ │ │ │ │ │ pass │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
file_exists_pass/893e9859: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_exists_with_number/file_exists_pass/893e9859
file_exists_pass/893e9859: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_exists_with_number/file_exists_pass/893e9859/stage
file_exists_pass/893e9859: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_exists_with_number/file_exists_pass/893e9859/file_exists_pass_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
file_exists_pass/893e9859 does not have any dependencies adding test to queue
file_exists_pass/893e9859: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_exists_with_number/file_exists_pass/893e9859/stage
file_exists_pass/893e9859: Running Test via command: bash --norc --noprofile -eo pipefail file_exists_pass_build.sh
file_exists_pass/893e9859: Test completed in 0.006783 seconds
file_exists_pass/893e9859: Test completed with returncode: 0
file_exists_pass/893e9859: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_exists_with_number/file_exists_pass/893e9859/file_exists_pass.out
file_exists_pass/893e9859: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_exists_with_number/file_exists_pass/893e9859/file_exists_pass.err
file_exists_pass/893e9859: Test all files: ['1'] existences
file_exists_pass/893e9859: file: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_exists_with_number/file_exists_pass/893e9859/stage/1 exists
file_exists_pass/893e9859: Exist Check: True
In this iteration we are going to run the following tests: [file_exists_pass/893e9859]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ file_exists_ │ generic.loc… │ PASS │ None None │ 0 │ 0.006783 │
│ pass/893e985 │ │ │ None │ │ │
│ 9 │ │ │ │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 1/1 Percentage: 100.000%
Failed Tests: 0/1 Percentage: 0.000%
Adding 1 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_v1mnnd_p.log
File and Directory Checks¶
In the next example, we introduce checks for files and directory via is_file
and
is_dir
property, which behaves similar to exists
except they will check if each item
is a file or directory. We expect the first test to fail, because $HOME/.bashrc is
not a directory but a file. The second test will incorporate the same test and
use is_file
for status check.
buildspecs:
file_and_dir_checks:
type: script
executor: generic.local.bash
description: status check for files and directories
run: hostname
status:
is_dir:
- $HOME
- $HOME/.bashrc
- /tmp
combined_file_and_dir_checks:
type: script
executor: generic.local.bash
description: status check for files and directories
run: hostname
status:
is_dir:
- $HOME
- /tmp
is_file:
- $HOME/.bashrc
Let’s build the test and see the output.
buildtest build -b tutorials/test_status/file_and_dir_check.yml
$ buildtest build -b tutorials/test_status/file_and_dir_check.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:40 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/file_and_dir_check.yml: VALID
Total builder objects created: 2
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ file_an… │ script │ generic… │ None │ None │ None │ status │ /home/… │
│ │ │ │ │ │ │ check │ │
│ │ │ │ │ │ │ for │ │
│ │ │ │ │ │ │ files │ │
│ │ │ │ │ │ │ and │ │
│ │ │ │ │ │ │ directo… │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ combine… │ script │ generic… │ None │ None │ None │ status │ /home/… │
│ │ │ │ │ │ │ check │ │
│ │ │ │ │ │ │ for │ │
│ │ │ │ │ │ │ files │ │
│ │ │ │ │ │ │ and │ │
│ │ │ │ │ │ │ directo… │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
file_and_dir_checks/3ff1b133: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_and_dir_check/file_and_dir_checks/3ff1b133
file_and_dir_checks/3ff1b133: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_and_dir_check/file_and_dir_checks/3ff1b133/stage
file_and_dir_checks/3ff1b133: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_and_dir_check/file_and_dir_checks/3ff1b133/file_and_dir_checks_build.sh
combined_file_and_dir_checks/d9f3a2b8: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_and_dir_check/combined_file_and_dir_checks/d9f3a2b8
combined_file_and_dir_checks/d9f3a2b8: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_and_dir_check/combined_file_and_dir_checks/d9f3a2b8/stage
combined_file_and_dir_checks/d9f3a2b8: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_and_dir_check/combined_file_and_dir_checks/d9f3a2b8/combined_file_and_dir_checks_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
file_and_dir_checks/3ff1b133 does not have any dependencies adding test to queue
combined_file_and_dir_checks/d9f3a2b8 does not have any dependencies adding test to queue
file_and_dir_checks/3ff1b133: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_and_dir_check/file_and_dir_checks/3ff1b133/stage
file_and_dir_checks/3ff1b133: Running Test via command: bash --norc --noprofile -eo pipefail file_and_dir_checks_build.sh
file_and_dir_checks/3ff1b133: Test completed in 0.006391 seconds
file_and_dir_checks/3ff1b133: Test completed with returncode: 0
file_and_dir_checks/3ff1b133: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_and_dir_check/file_and_dir_checks/3ff1b133/file_and_dir_checks.out
file_and_dir_checks/3ff1b133: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_and_dir_check/file_and_dir_checks/3ff1b133/file_and_dir_checks.err
file_and_dir_checks/3ff1b133: Test all files: ['$HOME', '$HOME/.bashrc', '/tmp'] existences
file_and_dir_checks/3ff1b133: file: /home/docs is a directory
file_and_dir_checks/3ff1b133: file: $HOME/.bashrc is not a directory
file_and_dir_checks/3ff1b133: file: /tmp is a directory
file_and_dir_checks/3ff1b133: Directory Existence Check: False
combined_file_and_dir_checks/d9f3a2b8: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_and_dir_check/combined_file_and_dir_checks/d9f3a2b8/stage
combined_file_and_dir_checks/d9f3a2b8: Running Test via command: bash --norc --noprofile -eo pipefail combined_file_and_dir_checks_build.sh
combined_file_and_dir_checks/d9f3a2b8: Test completed in 0.0065 seconds
combined_file_and_dir_checks/d9f3a2b8: Test completed with returncode: 0
combined_file_and_dir_checks/d9f3a2b8: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_and_dir_check/combined_file_and_dir_checks/d9f3a2b8/combined_file_and_dir_checks.out
combined_file_and_dir_checks/d9f3a2b8: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_and_dir_check/combined_file_and_dir_checks/d9f3a2b8/combined_file_and_dir_checks.err
combined_file_and_dir_checks/d9f3a2b8: Test all files: ['$HOME', '/tmp'] existences
combined_file_and_dir_checks/d9f3a2b8: file: /home/docs is a directory
combined_file_and_dir_checks/d9f3a2b8: file: /tmp is a directory
combined_file_and_dir_checks/d9f3a2b8: Directory Existence Check: True
combined_file_and_dir_checks/d9f3a2b8: Test all files: ['$HOME/.bashrc'] existences
combined_file_and_dir_checks/d9f3a2b8: file: /home/docs/.bashrc is a file
combined_file_and_dir_checks/d9f3a2b8: File Existence Check: True
In this iteration we are going to run the following tests: [file_and_dir_checks/3ff1b133, combined_file_and_dir_checks/d9f3a2b8]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ combined_fil │ generic.loc… │ PASS │ None None │ 0 │ 0.0065 │
│ e_and_dir_ch │ │ │ None │ │ │
│ ecks/d9f3a2b │ │ │ │ │ │
│ 8 │ │ │ │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ file_and_dir │ generic.loc… │ FAIL │ None None │ 0 │ 0.006391 │
│ _checks/3ff1 │ │ │ None │ │ │
│ b133 │ │ │ │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 1/2 Percentage: 50.000%
Failed Tests: 1/2 Percentage: 50.000%
Adding 2 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_wmv__p8g.log
Symbolic Link Check¶
buildtest can configure PASS/FAIL of test based on the status of symbolic link. This can be useful if your test will create a symbolic link to a file or directory and test will pass if the symbolic link is present.
You can use the is_symlink
property which expects a list of values that are checked for symbolic links. In the example below, the test will pass as all the values are valid symbolic links and are not broken. Note that variable and shell expansion
is supported.
buildspecs:
symlink_test:
type: script
executor: generic.local.bash
description: status check based on symbolic link
run: |
ln -s /tmp scratch
ln -s $HOME/.bashrc $HOME/.bashrc_link
status:
is_symlink:
- scratch
- $HOME/.bashrc_link
- ~/.bashrc_link
We can run this test by running the following.
buildtest build -b tutorials/test_status/is_symlink.yml
$ buildtest build -b tutorials/test_status/is_symlink.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:41 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/is_symlink.yml: VALID
Total builder objects created: 1
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ symlink… │ script │ generic… │ None │ None │ None │ status │ /home/… │
│ │ │ │ │ │ │ check │ │
│ │ │ │ │ │ │ based on │ │
│ │ │ │ │ │ │ symbolic │ │
│ │ │ │ │ │ │ link │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
symlink_test/d39ad0da: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/is_symlink/symlink_test/d39ad0da
symlink_test/d39ad0da: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/is_symlink/symlink_test/d39ad0da/stage
symlink_test/d39ad0da: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/is_symlink/symlink_test/d39ad0da/symlink_test_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
symlink_test/d39ad0da does not have any dependencies adding test to queue
symlink_test/d39ad0da: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/is_symlink/symlink_test/d39ad0da/stage
symlink_test/d39ad0da: Running Test via command: bash --norc --noprofile -eo pipefail symlink_test_build.sh
symlink_test/d39ad0da: Test completed in 0.008397 seconds
symlink_test/d39ad0da: Test completed with returncode: 0
symlink_test/d39ad0da: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/is_symlink/symlink_test/d39ad0da/symlink_test.out
symlink_test/d39ad0da: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/is_symlink/symlink_test/d39ad0da/symlink_test.err
symlink_test/d39ad0da: Check all items: ['scratch', '$HOME/.bashrc_link', '~/.bashrc_link'] for symbolic links
symlink_test/d39ad0da: scratch is a symbolic link to /tmp
symlink_test/d39ad0da: $HOME/.bashrc_link is a symbolic link to /home/docs/.bashrc
symlink_test/d39ad0da: ~/.bashrc_link is a symbolic link to /home/docs/.bashrc
symlink_test/d39ad0da: Symlink Check: True
In this iteration we are going to run the following tests: [symlink_test/d39ad0da]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ symlink_test │ generic.loc… │ PASS │ None None │ 0 │ 0.008397 │
│ /d39ad0da │ │ │ None │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 1/1 Percentage: 100.000%
Failed Tests: 0/1 Percentage: 0.000%
Adding 1 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_vaiae2gg.log
File Count¶
buildtest can check for number of files in a directory. This can be useful if your test writes number of files and you
want to check if the number of files is as expected. You can use the file_count
property to perform file count. This
property is a list of assertion, where each item is an object. The dir
and count
are required keys.
The dir
is the path to directory to perform directory traversal, and count
key is the number of expected files that will be
used for comparison. In the first test, we perform a directory walk and expect 5 files in the directory. We can perform directory
search based on file extension by using ext
key. The ext
property can be a string or a list. The second test will perform
directory walk on directory named foo and search for file extensions .sh, .py, .txt. The depth
property controls
the maximum depth for directory traversal, this must be of an integer type. The depth
property is optional and if not specified, we will
perform full directory traversal.
buildspecs:
file_count_on_directory:
type: script
executor: generic.local.bash
description: file count check in directory
run: |
mkdir -p foo
touch foo/{1..5}
status:
file_count:
- dir: foo
count: 5
file_count_by_extension:
type: script
executor: generic.local.bash
description: file count by extension
run: |
mkdir -p foo/bar
touch foo/{1..5}.sh
touch foo/bar/{1..3}.py foo/bar/{1..3}.txt
status:
file_count:
- dir: foo
ext: '.sh'
depth: 1
count: 5
- dir: foo/bar
ext: ['.py', '.txt']
count: 6
We can run this test by running the following.
buildtest build -b tutorials/test_status/file_count.yml
$ buildtest build -b tutorials/test_status/file_count.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:41 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/file_count.yml: VALID
Total builder objects created: 2
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ file_co… │ script │ generic… │ None │ None │ None │ file │ /home/… │
│ │ │ │ │ │ │ count │ │
│ │ │ │ │ │ │ check in │ │
│ │ │ │ │ │ │ directo… │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ file_co… │ script │ generic… │ None │ None │ None │ file │ /home/… │
│ │ │ │ │ │ │ count by │ │
│ │ │ │ │ │ │ extensi… │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
file_count_on_directory/cfd025ce: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_on_directory/cfd025ce
file_count_on_directory/cfd025ce: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_on_directory/cfd025ce/stage
file_count_on_directory/cfd025ce: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_on_directory/cfd025ce/file_count_on_directory_build.sh
file_count_by_extension/cb0a6254: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_by_extension/cb0a6254
file_count_by_extension/cb0a6254: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_by_extension/cb0a6254/stage
file_count_by_extension/cb0a6254: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_by_extension/cb0a6254/file_count_by_extension_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
file_count_on_directory/cfd025ce does not have any dependencies adding test to queue
file_count_by_extension/cb0a6254 does not have any dependencies adding test to queue
file_count_on_directory/cfd025ce: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_on_directory/cfd025ce/stage
file_count_on_directory/cfd025ce: Running Test via command: bash --norc --noprofile -eo pipefail file_count_on_directory_build.sh
file_count_on_directory/cfd025ce: Test completed in 0.007725 seconds
file_count_on_directory/cfd025ce: Test completed with returncode: 0
file_count_on_directory/cfd025ce: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_on_directory/cfd025ce/file_count_on_directory.out
file_count_on_directory/cfd025ce: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_on_directory/cfd025ce/file_count_on_directory.err
file_count_on_directory/cfd025ce: Found 5 file in directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_on_directory/cfd025ce/stage/foo. Comparing with reference count: 5. Comparison check is 5 == 5 which evaluates to True
file_count_on_directory/cfd025ce: File Count Check: True
file_count_by_extension/cb0a6254: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_by_extension/cb0a6254/stage
file_count_by_extension/cb0a6254: Running Test via command: bash --norc --noprofile -eo pipefail file_count_by_extension_build.sh
file_count_by_extension/cb0a6254: Test completed in 0.008244 seconds
file_count_by_extension/cb0a6254: Test completed with returncode: 0
file_count_by_extension/cb0a6254: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_by_extension/cb0a6254/file_count_by_extension.out
file_count_by_extension/cb0a6254: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_by_extension/cb0a6254/file_count_by_extension.err
file_count_by_extension/cb0a6254: Found 5 file in directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_by_extension/cb0a6254/stage/foo. Comparing with reference count: 5. Comparison check is 5 == 5 which evaluates to True
file_count_by_extension/cb0a6254: Found 6 file in directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count/file_count_by_extension/cb0a6254/stage/foo/bar. Comparing with reference count: 6. Comparison check is 6 == 6 which evaluates to True
file_count_by_extension/cb0a6254: File Count Check: True
In this iteration we are going to run the following tests: [file_count_on_directory/cfd025ce, file_count_by_extension/cb0a6254]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ file_count_o │ generic.loc… │ PASS │ None None │ 0 │ 0.007725 │
│ n_directory/ │ │ │ None │ │ │
│ cfd025ce │ │ │ │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ file_count_b │ generic.loc… │ PASS │ None None │ 0 │ 0.008244 │
│ y_extension/ │ │ │ None │ │ │
│ cb0a6254 │ │ │ │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 2/2 Percentage: 100.000%
Failed Tests: 0/2 Percentage: 0.000%
Adding 2 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_cm9aafoo.log
In the next example, we introduce filepattern
property which allows you to check for files based on a pattern. The filepattern
property
is a regular expression which is compiled via re.compile and applied to a
directory path. Please note the regular expression must be valid, otherwise buildtest will not return any files during directory traversal.
You can use filepattern
and ext
property together to search for files. If both are specified, then we will search for files
with both methods and join the two list prior to performing comparison.
buildspecs:
file_count_by_expression:
type: script
executor: generic.local.bash
description: file count by expression
run: |
mkdir -p /tmp
touch /tmp/foo{1..5}.txt
ls -l /tmp/foo*.txt
filenames=$(find $BUILDTEST_ROOT/buildtest -type f \( -name "defaults.py" -o -name "main.py" \) -maxdepth 1)
totalfiles=$(find $BUILDTEST_ROOT/buildtest -type f \( -name "defaults.py" -o -name "main.py" \) -maxdepth 1 | wc -l)
echo "Filenames: $filenames"
echo "Total files: $totalfiles"
status:
file_count:
- dir: /tmp
filepattern: 'foo[1-5].txt$'
count: 5
- dir: '$BUILDTEST_ROOT/buildtest'
filepattern: '(defaults|main).py$'
count: 2
depth: 1
file_extension_and_filepattern:
type: script
executor: generic.local.bash
description: file count by file extension and file pattern
run: |
touch foo{1..5}.txt
touch {conf,main}.py
ls -l
status:
file_count:
- dir: .
ext: '.txt'
filepattern: '(conf|main).py$'
count: 7
Let’s build this test by running the following:
buildtest build -b tutorials/test_status/file_count_pattern.yml
$ buildtest build -b tutorials/test_status/file_count_pattern.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:42 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/file_count_pattern.yml: VALID
Total builder objects created: 2
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ file_co… │ script │ generic… │ None │ None │ None │ file │ /home/… │
│ │ │ │ │ │ │ count by │ │
│ │ │ │ │ │ │ express… │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ file_ex… │ script │ generic… │ None │ None │ None │ file │ /home/… │
│ │ │ │ │ │ │ count by │ │
│ │ │ │ │ │ │ file │ │
│ │ │ │ │ │ │ extensi… │ │
│ │ │ │ │ │ │ and file │ │
│ │ │ │ │ │ │ pattern │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
file_count_by_expression/c69da712: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_count_by_expression/c69da712
file_count_by_expression/c69da712: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_count_by_expression/c69da712/stage
file_count_by_expression/c69da712: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_count_by_expression/c69da712/file_count_by_expression_build.sh
file_extension_and_filepattern/08f07a94: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_extension_and_filepattern/08f07a94
file_extension_and_filepattern/08f07a94: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_extension_and_filepattern/08f07a94/stage
file_extension_and_filepattern/08f07a94: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_extension_and_filepattern/08f07a94/file_extension_and_filepattern_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
file_count_by_expression/c69da712 does not have any dependencies adding test to queue
file_extension_and_filepattern/08f07a94 does not have any dependencies adding test to queue
file_count_by_expression/c69da712: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_count_by_expression/c69da712/stage
file_count_by_expression/c69da712: Running Test via command: bash --norc --noprofile -eo pipefail file_count_by_expression_build.sh
file_count_by_expression/c69da712: Test completed in 0.015133 seconds
file_count_by_expression/c69da712: Test completed with returncode: 0
file_count_by_expression/c69da712: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_count_by_expression/c69da712/file_count_by_expression.out
file_count_by_expression/c69da712: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_count_by_expression/c69da712/file_count_by_expression.err
file_count_by_expression/c69da712: Found 5 file in directory: /tmp. Comparing with reference count: 5. Comparison check is 5 == 5 which evaluates to True
file_count_by_expression/c69da712: Found 2 file in directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/buildtest. Comparing with reference count: 2. Comparison check is 2 == 2 which evaluates to True
file_count_by_expression/c69da712: File Count Check: True
file_extension_and_filepattern/08f07a94: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_extension_and_filepattern/08f07a94/stage
file_extension_and_filepattern/08f07a94: Running Test via command: bash --norc --noprofile -eo pipefail file_extension_and_filepattern_build.sh
file_extension_and_filepattern/08f07a94: Test completed in 0.00919 seconds
file_extension_and_filepattern/08f07a94: Test completed with returncode: 0
file_extension_and_filepattern/08f07a94: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_extension_and_filepattern/08f07a94/file_extension_and_filepattern.out
file_extension_and_filepattern/08f07a94: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_extension_and_filepattern/08f07a94/file_extension_and_filepattern.err
file_extension_and_filepattern/08f07a94: Found 7 file in directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_pattern/file_extension_and_filepattern/08f07a94/stage. Comparing with reference count: 7. Comparison check is 7 == 7 which evaluates to True
file_extension_and_filepattern/08f07a94: File Count Check: True
In this iteration we are going to run the following tests: [file_count_by_expression/c69da712, file_extension_and_filepattern/08f07a94]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ file_count_b │ generic.loc… │ PASS │ None None │ 0 │ 0.015133 │
│ y_expression │ │ │ None │ │ │
│ /c69da712 │ │ │ │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ file_extensi │ generic.loc… │ PASS │ None None │ 0 │ 0.00919 │
│ on_and_filep │ │ │ None │ │ │
│ attern/08f07 │ │ │ │ │ │
│ a94 │ │ │ │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 2/2 Percentage: 100.000%
Failed Tests: 0/2 Percentage: 0.000%
Adding 2 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_bjcmf30h.log
In the next example, we will introduce filetype
property that can be used to filter directory search based on file type.
The filetype
property can one of the following values file, dir, symlink. Once set, the directory traversal will
seek out files based on the file type. Note that when filetype
is set to dir
we will return the parent directory and
all sub-directories. This test will create a few subdirectories and create symbolic link, next we will perform directory search
by directory and symbolic link. We expect this test to pass as we will find 3 directories and 2 symbolic links.
buildspecs:
file_count_by_filetype:
type: script
executor: generic.local.bash
description: Count the number of directories and symbolic links
run: |
mkdir -p foo/{bar,baz}
find foo -type dir
ln -s foo/bar foo/bar.link
ln -s foo/baz foo/baz.link
status:
file_count:
- dir: foo
count: 3
filetype: 'dir'
- dir: foo
count: 2
filetype: 'symlink'
Let’s build this test by running the following:
buildtest build -b tutorials/test_status/file_count_filetype.yml
$ buildtest build -b tutorials/test_status/file_count_filetype.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:43 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/file_count_filetype.yml: VALID
Total builder objects created: 1
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ file_co… │ script │ generic… │ None │ None │ None │ Count │ /home/… │
│ │ │ │ │ │ │ the │ │
│ │ │ │ │ │ │ number │ │
│ │ │ │ │ │ │ of │ │
│ │ │ │ │ │ │ directo… │ │
│ │ │ │ │ │ │ and │ │
│ │ │ │ │ │ │ symbolic │ │
│ │ │ │ │ │ │ links │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
file_count_by_filetype/dce2d743: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_filetype/file_count_by_filetype/dce2d743
file_count_by_filetype/dce2d743: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_filetype/file_count_by_filetype/dce2d743/stage
file_count_by_filetype/dce2d743: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_filetype/file_count_by_filetype/dce2d743/file_count_by_filetype_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
file_count_by_filetype/dce2d743 does not have any dependencies adding test to queue
file_count_by_filetype/dce2d743: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_filetype/file_count_by_filetype/dce2d743/stage
file_count_by_filetype/dce2d743: Running Test via command: bash --norc --noprofile -eo pipefail file_count_by_filetype_build.sh
file_count_by_filetype/dce2d743: Test completed in 0.010247 seconds
file_count_by_filetype/dce2d743: Test completed with returncode: 0
file_count_by_filetype/dce2d743: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_filetype/file_count_by_filetype/dce2d743/file_count_by_filetype.out
file_count_by_filetype/dce2d743: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_filetype/file_count_by_filetype/dce2d743/file_count_by_filetype.err
file_count_by_filetype/dce2d743: Found 3 file in directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_filetype/file_count_by_filetype/dce2d743/stage/foo. Comparing with reference count: 3. Comparison check is 3 == 3 which evaluates to True
file_count_by_filetype/dce2d743: Found 2 file in directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_filetype/file_count_by_filetype/dce2d743/stage/foo. Comparing with reference count: 2. Comparison check is 2 == 2 which evaluates to True
file_count_by_filetype/dce2d743: File Count Check: True
In this iteration we are going to run the following tests: [file_count_by_filetype/dce2d743]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ file_count_b │ generic.loc… │ PASS │ None None │ 0 │ 0.010247 │
│ y_filetype/d │ │ │ None │ │ │
│ ce2d743 │ │ │ │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 1/1 Percentage: 100.000%
Failed Tests: 0/1 Percentage: 0.000%
Adding 1 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_tqfu61vj.log
Buildtest will perform a directory walk when using file_count
, which can run into performance issues if you have a large directory.
We have added a safety check during directory traversal to a maximum of 999999 files. You have the option to configure the directory
traversal limit using file_traversal_limit
which is an integer, the default value is 10000 if not specified. The minimum value and
maximum value can be 1 and 999999 respectively.
In this next example, we will illustrate how this feature works. We will create 99 .txt files in directory foo. We will
perform two assertions with different values for file_traversal_limit
. In the first example, we will set this to 50 and
expect 50 files returned. We expect this check to be True. In the next example, we will set file_traversal_limit
to 20 and
set count: 10
where we should expect a failure. In principle, we should retrieve 20 files but this will mismatch the comparison check.
buildspecs:
file_traverse_limit:
type: script
executor: generic.local.bash
description: Use of file_traverse_limit to limit number of files searched in a directory
run: |
mkdir foo
touch foo/{1..99}.txt
status:
file_count:
- dir: foo
count: 50
file_traverse_limit: 50
- dir: foo
count: 10
file_traverse_limit: 20
We can try building this test by running the following:
buildtest build -b tutorials/test_status/file_count_file_traverse_limit.yml
$ buildtest build -b tutorials/test_status/file_count_file_traverse_limit.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:43 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/file_count_file_traverse_limit.yml: VALID
Total builder objects created: 1
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ file_tr… │ script │ generic… │ None │ None │ None │ Use of │ /home/… │
│ │ │ │ │ │ │ file_tr… │ │
│ │ │ │ │ │ │ to limit │ │
│ │ │ │ │ │ │ number │ │
│ │ │ │ │ │ │ of files │ │
│ │ │ │ │ │ │ searched │ │
│ │ │ │ │ │ │ in a │ │
│ │ │ │ │ │ │ directo… │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
file_traverse_limit/f7606a9a: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_file_traverse_limit/file_traverse_limit/f7606a9a
file_traverse_limit/f7606a9a: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_file_traverse_limit/file_traverse_limit/f7606a9a/stage
file_traverse_limit/f7606a9a: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_file_traverse_limit/file_traverse_limit/f7606a9a/file_traverse_limit_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
file_traverse_limit/f7606a9a does not have any dependencies adding test to queue
file_traverse_limit/f7606a9a: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_file_traverse_limit/file_traverse_limit/f7606a9a/stage
file_traverse_limit/f7606a9a: Running Test via command: bash --norc --noprofile -eo pipefail file_traverse_limit_build.sh
file_traverse_limit/f7606a9a: Test completed in 0.009433 seconds
file_traverse_limit/f7606a9a: Test completed with returncode: 0
file_traverse_limit/f7606a9a: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_file_traverse_limit/file_traverse_limit/f7606a9a/file_traverse_limit.out
file_traverse_limit/f7606a9a: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_file_traverse_limit/file_traverse_limit/f7606a9a/file_traverse_limit.err
file_traverse_limit/f7606a9a: Found 50 file in directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_file_traverse_limit/file_traverse_limit/f7606a9a/stage/foo. Comparing with reference count: 50. Comparison check is 50 == 50 which evaluates to True
file_traverse_limit/f7606a9a: Found 20 file in directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/file_count_file_traverse_limit/file_traverse_limit/f7606a9a/stage/foo. Comparing with reference count: 10. Comparison check is 20 == 10 which evaluates to False
file_traverse_limit/f7606a9a: File Count Check: False
In this iteration we are going to run the following tests: [file_traverse_limit/f7606a9a]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ file_travers │ generic.loc… │ FAIL │ None None │ 0 │ 0.009433 │
│ e_limit/f760 │ │ │ None │ │ │
│ 6a9a │ │ │ │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 0/1 Percentage: 0.000%
Failed Tests: 1/1 Percentage: 100.000%
Adding 1 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_f6iza_uk.log
Status Mode¶
By default, the status check performed by buildtest is a logical OR, where if any of the status check is True, then the test will
PASS. However, if you want to change this behavior to logical AND, you can use the mode property. The valid values are
any
, all
. In the example below, we have two tests that illustrate the use of mode
.
buildspecs:
status_logical_and:
type: script
executor: 'generic.local.bash'
description: 'Using logical AND to check status'
run: |
echo "This is a test"
exit 1
status:
mode: all
returncode: 1
regex:
stream: stdout
exp: 'This is a test'
status_logical_or:
type: script
executor: 'generic.local.bash'
description: 'Using logical OR to check status'
run: |
echo "This is a test"
exit 1
status:
mode: any
returncode: 0
regex:
stream: stdout
exp: 'This is a test'
The first test uses mode: all
which implies all status check are evaluated as logical AND, we expect this test to PASS.
In the second test, we use mode: any
where status check are evalued as logical OR which is the default behavior. Note if mode
is not specified, it is equivalent to mode: any
. In second test, we expect this to pass because regex check will PASS however,
the returncode check will fail due to mismatch in returncode. If we changed this to mode: all
then we would expect this test
to fail.
Shown below is the output of running this test.
buildtest build -b tutorials/test_status/mode.yml
$ buildtest build -b tutorials/test_status/mode.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:44 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/test_status/mode.yml: VALID
Total builder objects created: 2
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ status_… │ script │ generic… │ None │ None │ None │ Using │ /home/… │
│ │ │ │ │ │ │ logical │ │
│ │ │ │ │ │ │ AND to │ │
│ │ │ │ │ │ │ check │ │
│ │ │ │ │ │ │ status │ │
├──────────┼────────┼──────────┼──────────┼───────┼───────┼──────────┼─────────┤
│ status_… │ script │ generic… │ None │ None │ None │ Using │ /home/… │
│ │ │ │ │ │ │ logical │ │
│ │ │ │ │ │ │ OR to │ │
│ │ │ │ │ │ │ check │ │
│ │ │ │ │ │ │ status │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
status_logical_and/8e85eb72: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_and/8e85eb72
status_logical_and/8e85eb72: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_and/8e85eb72/stage
status_logical_and/8e85eb72: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_and/8e85eb72/status_logical_and_build.sh
status_logical_or/6cbc426c: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_or/6cbc426c
status_logical_or/6cbc426c: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_or/6cbc426c/stage
status_logical_or/6cbc426c: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_or/6cbc426c/status_logical_or_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
status_logical_or/6cbc426c does not have any dependencies adding test to queue
status_logical_and/8e85eb72 does not have any dependencies adding test to queue
status_logical_or/6cbc426c: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_or/6cbc426c/stage
status_logical_or/6cbc426c: Running Test via command: bash --norc --noprofile -eo pipefail status_logical_or_build.sh
status_logical_or/6cbc426c: Test completed in 0.005762 seconds
status_logical_or/6cbc426c: Test completed with returncode: 1
status_logical_or/6cbc426c: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_or/6cbc426c/status_logical_or.out
status_logical_or/6cbc426c: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_or/6cbc426c/status_logical_or.err
status_logical_or/6cbc426c: performing regular expression - 'This is a test' on file: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_or/6cbc426c/status_logical_or.out
status_logical_or/6cbc426c: Regular Expression Match - Success!
status_logical_and/8e85eb72: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_and/8e85eb72/stage
status_logical_and/8e85eb72: Running Test via command: bash --norc --noprofile -eo pipefail status_logical_and_build.sh
status_logical_and/8e85eb72: Test completed in 0.005717 seconds
status_logical_and/8e85eb72: Test completed with returncode: 1
status_logical_and/8e85eb72: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_and/8e85eb72/status_logical_and.out
status_logical_and/8e85eb72: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_and/8e85eb72/status_logical_and.err
status_logical_and/8e85eb72: Checking returncode - 1 is matched in list [1]
status_logical_and/8e85eb72: performing regular expression - 'This is a test' on file: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/mode/status_logical_and/8e85eb72/status_logical_and.out
status_logical_and/8e85eb72: Regular Expression Match - Success!
In this iteration we are going to run the following tests: [status_logical_or/6cbc426c, status_logical_and/8e85eb72]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ status_logic │ generic.loc… │ PASS │ None True │ 1 │ 0.005762 │
│ al_or/6cbc42 │ │ │ None │ │ │
│ 6c │ │ │ │ │ │
├──────────────┼──────────────┼────────┼───────────────┼────────────┼──────────┤
│ status_logic │ generic.loc… │ PASS │ True True │ 1 │ 0.005717 │
│ al_and/8e85e │ │ │ None │ │ │
│ b72 │ │ │ │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 2/2 Percentage: 100.000%
Failed Tests: 0/2 Percentage: 0.000%
Adding 2 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_pjljwrsl.log
Skipping test¶
By default, buildtest will run all tests defined in buildspecs
section, if you
want to skip a test use the skip
field which expects a boolean value. Shown
below is an example test.
buildspecs:
skip:
type: script
executor: generic.local.bash
description: This test is skipped
skip: Yes
tags: [tutorials]
run: hostname
unskipped:
type: script
executor: generic.local.bash
description: This test is not skipped
skip: No
tags: [tutorials]
run: hostname
The first test skip will be ignored by buildtest because skip: true
is defined
while unskipped will be processed as usual.
Note
YAML and JSON have different representation for boolean. For json schema
valid values are true
and false
see https://json-schema.org/understanding-json-schema/reference/boolean.html
however YAML has many more representation for boolean see https://yaml.org/type/bool.html. You
may use any of the YAML boolean, however it’s best to stick with json schema values
true
and false
.
Here is an example build, notice message [skip] test is skipped
during the build
stage
buildtest build -b tutorials/skip_tests.yml
$ buildtest build -b tutorials/skip_tests.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:45 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
skip: skipping test due to 'skip' property.
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/skip_tests.yml: VALID
Total builder objects created: 1
Builders by type=script
┏━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ builder ┃ type ┃ executor ┃ compiler ┃ nodes ┃ procs ┃ descrip… ┃ builds… ┃
┡━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ unskipp… │ script │ generic… │ None │ None │ None │ This │ /home/… │
│ │ │ │ │ │ │ test is │ │
│ │ │ │ │ │ │ not │ │
│ │ │ │ │ │ │ skipped │ │
└──────────┴────────┴──────────┴──────────┴───────┴───────┴──────────┴─────────┘
──────────────────────────────── Building Test ─────────────────────────────────
unskipped/fc384f7d: Creating test directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/skip_tests/unskipped/fc384f7d
unskipped/fc384f7d: Creating the stage directory: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/skip_tests/unskipped/fc384f7d/stage
unskipped/fc384f7d: Writing build script: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/skip_tests/unskipped/fc384f7d/unskipped_build.sh
──────────────────────────────── Running Tests ─────────────────────────────────
Spawning 1 processes for processing builders
───────────────────────────────── Iteration 1 ──────────────────────────────────
unskipped/fc384f7d does not have any dependencies adding test to queue
unskipped/fc384f7d: Current Working Directory : /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/skip_tests/unskipped/fc384f7d/stage
unskipped/fc384f7d: Running Test via command: bash --norc --noprofile -eo pipefail unskipped_build.sh
unskipped/fc384f7d: Test completed in 0.006553 seconds
unskipped/fc384f7d: Test completed with returncode: 0
unskipped/fc384f7d: Writing output file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/skip_tests/unskipped/fc384f7d/unskipped.out
unskipped/fc384f7d: Writing error file - /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/tests/generic.local.bash/skip_tests/unskipped/fc384f7d/unskipped.err
In this iteration we are going to run the following tests: [unskipped/fc384f7d]
Test Summary
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ┃ ┃ ┃ checks ┃ ┃ ┃
┃ ┃ ┃ ┃ (ReturnCode, ┃ ┃ ┃
┃ ┃ ┃ ┃ Regex, ┃ ┃ ┃
┃ builder ┃ executor ┃ status ┃ Runtime) ┃ returncode ┃ runtime ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ unskipped/fc │ generic.loc… │ PASS │ None None │ 0 │ 0.006553 │
│ 384f7d │ │ │ None │ │ │
└──────────────┴──────────────┴────────┴───────────────┴────────────┴──────────┘
Passed Tests: 1/1 Percentage: 100.000%
Failed Tests: 0/1 Percentage: 0.000%
Adding 1 test results to /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/report.json
Writing Logfile to: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/logs/buildtest_chsptn9w.log
Skipping a buildspec¶
Sometimes you may want to skip all test in a buildspec instead of updating every test with skip
property, this can be done by setting
skip at the top-level. This can be useful if you are running several test in a directory such as buildtest build -b dir1/
and you don’t
want to explicitly exclude file via -x
option every time, instead you can hardcode this into the buildspec. A typical use-case of skipping
test is when a test is broken and you don’t want to run it then its good idea to set skip: yes
on the buildspec and fix it later.
In this next example we set skip: yes
, buildtest will skip the buildspec and no test will be processed even if skip
is set in each test.
skip: yes
buildspecs:
skip_all_tests:
type: script
executor: generic.local.bash
description: "All test in this buildspec are skipped"
tags: [tutorials]
run: hostname
this_test_is_also_skipped:
type: script
skip: no
executor: generic.local.bash
description: "This test is also skipped even if skip is defined in test"
tags: [ tutorials ]
run: hostname
If you try building this buildspec, you will see buildtest will skip the buildspec and terminate.
buildtest build -b tutorials/skip_buildspec.yml
$ buildtest build -b tutorials/skip_buildspec.yml
╭───────────────────────────── buildtest summary ──────────────────────────────╮
│ │
│ User: docs │
│ Hostname: build-20833214-project-280831-buildtest │
│ Platform: Linux │
│ Current Time: 2023/05/26 18:39:45 │
│ buildtest path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ buildtest version: 1.4 │
│ python path: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ python version: 3.7.15 │
│ Configuration File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Test Directory: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Report File: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ Command: /home/docs/checkouts/readthedocs.org/user_builds/buildte │
│ │
╰──────────────────────────────────────────────────────────────────────────────╯
─────────────────────────── Discovering Buildspecs ────────────────────────────
Discovered buildspecs
╔══════════════════════════════════════════════════════════════════════════════╗
║ buildspec ║
╟──────────────────────────────────────────────────────────────────────────────╢
║ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… ║
╚══════════════════════════════════════════════════════════════════════════════╝
Total Discovered Buildspecs: 1
Total Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
────────────────────────────── Parsing Buildspecs ──────────────────────────────
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/skip_buildspec.yml: skipping all test since 'skip' is defined
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/tutorials/skip_buildspec.yml: VALID
Buildspecs Filtered out
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ buildspecs ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/… │
└──────────────────────────────────────────────────────────────────────────────┘
buildtest is unable to create any tests because there are no valid buildspecs.
Please see logfile: /home/docs/checkouts/readthedocs.org/user_builds/buildtest/checkouts/devel/var/buildtest.log