avocado.rst 47.5 KB
Newer Older
C
Cleber Rosa 已提交
1 2 3 4 5 6 7 8
:title: avocado
:subtitle: test runner command line tool
:title_upper: AVOCADO
:manual_section: 1

SYNOPSIS
========

A
Amador Pahim 已提交
9 10
avocado [-h] [-v] [--config [CONFIG_FILE]] [--show [STREAM[:LVL]]] [-s]
 {config,diff,distro,exec-path,list,multiplex,plugins,run,sysinfo} ...
C
Cleber Rosa 已提交
11 12 13 14

DESCRIPTION
===========

15
Avocado is a modern test framework that is built on the experience
C
Cleber Rosa 已提交
16 17
accumulated with `autotest` (`http://autotest.github.io`).

A
Amador Pahim 已提交
18 19
`avocado` is also the name of its test runner command line tool,
described in this man page.
20

A
Amador Pahim 已提交
21 22
For more information about the Avocado project, please check its
website: http://avocado-framework.github.io/
C
Cleber Rosa 已提交
23 24 25 26

OPTIONS
=======

27 28
The following list of options are builtin, application level `avocado`
options. Most other options are implemented via plugins and will depend
A
Amador Pahim 已提交
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465
on them being loaded (`avocado --help`)::

    -h, --help            show this help message and exit
    -v, --version         show program's version number and exit
    --config [CONFIG_FILE]
                          Use custom configuration from a file
    --show [STREAM[:LVL]]
                          List of comma separated builtin logs, or logging
                          streams optionally followed by LEVEL (DEBUG,INFO,...).
                          Builtin streams are: "test": test output; "debug":
                          tracebacks and other debugging info; "app":
                          application output; "early": early logging of other
                          streams, including test (very verbose); "remote":
                          fabric/paramiko debug; "all": all builtin streams;
                          "none": disables regular output (leaving only errors
                          enabled). By default: 'app'
    -s, --silent          disables regular output (leaving only errors enabled)

Real use of avocado depends on running avocado subcommands. This a
typical list of avocado subcommands::

    config              Shows avocado config keys
    diff                Shows the difference between 2 jobs.
    distro              Shows detected Linux distribution
    exec-path           Returns path to avocado bash libraries and exits.
    list                List available tests
    multiplex           Tool to analyze and visualize test variants and params
    plugins             Displays plugin information
    run                 Runs one or more tests (native test, test alias,
                        binary or script)
    sysinfo             Collect system information

To get usage instructions for a given subcommand, run it with `--help`.
Example::

    $ avocado run --help

Options for subcommand `run` (`avocado run --help`)::

    positional arguments:
      TEST_REFERENCE        List of test references (aliases or paths)

    optional arguments:
      -h, --help            show this help message and exit
      -d, --dry-run         Instead of running the test only list them and log
                            their params.
      --force-job-id UNIQUE_JOB_ID
                            Forces the use of a particular job ID. Used internally
                            when interacting with an avocado server. You should
                            not use this option unless you know exactly what
                            you're doing
      --job-results-dir DIRECTORY
                            Forces to use of an alternate job results directory.
      --job-timeout SECONDS
                            Set the maximum amount of time (in SECONDS) that tests
                            are allowed to execute. Values <= zero means "no
                            timeout". You can also use suffixes, like: s
                            (seconds), m (minutes), h (hours).
      --failfast {on,off}   Enable or disable the job interruption on first failed
                            test.
      --keep-tmp {on,off}   Keep job temporary files (useful for avocado
                            debugging). Defaults to off.
      --sysinfo {on,off}    Enable or disable system information (hardware
                            details, profilers, etc.). Current: on

    output and result format:
      -s, --silent          Silence stdout
      --show-job-log        Display only the job log on stdout. Useful for test
                            debugging purposes. No output will be displayed if you
                            also specify --silent
      --store-logging-stream [STREAM[:LEVEL] [STREAM[:LEVEL] ...]]
                            Store given logging STREAMs in
                            $JOB_RESULTS_DIR/$STREAM.$LEVEL.
      --html FILE           Enable HTML output to the FILE where the result should
                            be written. The value - (output to stdout) is not
                            supported since not all HTML resources can be embedded
                            into a single file (page resources will be copied to
                            the output file dir)
      --open-browser        Open the generated report on your preferred browser.
                            This works even if --html was not explicitly passed,
                            since an HTML report is always generated on the job
                            results dir. Current: False
      --html-job-result {on,off}
                            Enables default HTML result in the job results
                            directory. File will be located at
                            "html/results.html".
      --journal             Records test status changes (for use with avocado-
                            journal-replay and avocado-server)
      --json FILE           Enable JSON result format and write it to FILE. Use
                            '-' to redirect to the standard output.
      --json-job-result {on,off}
                            Enables default JSON result in the job results
                            directory. File will be named "results.json".
      --tap FILE            Enable TAP result output and write it to FILE. Use '-'
                            to redirect to the standard output.
      --tap-job-result {on,off}
                            Enables default TAP result in the job results
                            directory. File will be named "results.tap".
      --xunit FILE          Enable xUnit result format and write it to FILE. Use
                            '-' to redirect to the standard output.
      --xunit-job-result {on,off}
                            Enables default xUnit result in the job results
                            directory. File will be named "results.xml".
      -z, --archive         Archive (ZIP) files generated by tests

    output check arguments:
      --output-check-record {none,all,stdout,stderr}
                            Record output streams of your tests to reference files
                            (valid options: none (do not record output streams),
                            all (record both stdout and stderr), stdout (record
                            only stderr), stderr (record only stderr). Current:
                            none
      --output-check {on,off}
                            Enable or disable test output (stdout/stderr) check.
                            If this option is off, no output will be checked, even
                            if there are reference files present for the test.
                            Current: on (output check enabled)

    loader options:
      --loaders [LOADERS [LOADERS ...]]
                            Overrides the priority of the test loaders. You can
                            specify either @loader_name or TEST_TYPE. By default
                            it tries all available loaders according to priority
                            set in settings->plugins.loaders.
      --external-runner EXECUTABLE
                            Path to an specific test runner that allows the use of
                            its own tests. This should be used for running tests
                            that do not conform to Avocado' SIMPLE testinterface
                            and can not run standalone. Note: the use of
                            --external-runner overwrites the --loaders to
                            "external_runner"
      --external-runner-chdir {runner,test}
                            Change directory before executing tests. This option
                            may be necessary because of requirements and/or
                            limitations of the external test runner. If the
                            external runner requires to be run from its own base
                            directory,use "runner" here. If the external runner
                            runs tests based on files and requires to be run from
                            the directory where those files are located, use
                            "test" here and specify the test directory with the
                            option "--external-runner-testdir". Defaults to "None"
      --external-runner-testdir DIRECTORY
                            Where test files understood by the external test
                            runner are located in the filesystem. Obviously this
                            assumes and only applies to external test runners that
                            run tests from files

    filtering parameters:
      --filter-by-tags TAGS
                            Filter INSTRUMENTED tests based on ":avocado:
                            tags=tag1,tag2" notation in their class docstring
      --filter-by-tags-include-empty
                            Include all tests without tags during filtering. This
                            effectively means they will be kept in the test suite
                            found previously to filtering.

    test execution inside docker container:
      --docker IMAGE        Name of the docker image torun tests on.
      --docker-cmd CMD      Override the docker command, eg. 'sudo docker' or
                            other base docker options like hypervisor. Default:
                            'docker'
      --docker-options OPT  Extra options for docker run cmd. (see: man docker-
                            run)
      --docker-no-cleanup   Preserve container after test

    keep environment variables:
      --env-keep ENV_KEEP   Keep environment variables in remote executions

    GNU Debugger support:
      --gdb-run-bin EXECUTABLE[:BREAKPOINT]
                            Run a given executable inside the GNU debugger,
                            pausing at a given breakpoint (defaults to "main")
      --gdb-prerun-commands EXECUTABLE:COMMANDS
                            After loading an executable in GDB, but before
                            actually running it, execute the GDB commands in the
                            given file. EXECUTABLE is optional, if omitted
                            COMMANDS will apply to all executables
      --gdb-coredump {on,off}
                            Automatically generate a core dump when the inferior
                            process received a fatal signal such as SIGSEGV or
                            SIGABRT

    test execution on a remote machine:
      --remote-hostname REMOTE_HOSTNAME
                            Specify the hostname to login on remote machine
      --remote-port REMOTE_PORT
                            Specify the port number to login on remote machine.
                            Current: 22
      --remote-username REMOTE_USERNAME
                            Specify the username to login on remote machine.
                            Current: apahim
      --remote-password REMOTE_PASSWORD
                            Specify the password to login on remote machine
      --remote-key-file REMOTE_KEY_FILE
                            Specify an identity file with a private key instead of
                            a password (Example: .pem files from Amazon EC2)
      --remote-timeout SECONDS
                            Amount of time (in seconds) to wait for a successful
                            connection to the remote machine. Defaults to 60
                            seconds.

    job replay:
      --replay REPLAY_JOBID
                            Replay a job identified by its (partial) hash id. Use
                            "--replay latest" to replay the latest job.
      --replay-test-status REPLAY_TESTSTATUS
                            Filter tests to replay by test status
      --replay-ignore REPLAY_IGNORE
                            Ignore variants (variants) and/or configuration
                            (config) from the source job

    test execution on a Virtual Machine:
      --vm-domain VM_DOMAIN
                            Specify Libvirt Domain Name
      --vm-hypervisor-uri VM_HYPERVISOR_URI
                            Specify hypervisor URI driver connection. Current:
                            qemu:///system
      --vm-hostname VM_HOSTNAME
                            Specify VM hostname to login. By default Avocado
                            attempts to automatically find the VM IP address.
      --vm-port VM_PORT     Specify the port number to login on VM. Current: 22
      --vm-username VM_USERNAME
                            Specify the username to login on VM
      --vm-password VM_PASSWORD
                            Specify the password to login on VM
      --vm-key-file VM_KEY_FILE
                            Specify an identity file with a private key instead of
                            a password (Example: .pem files from Amazon EC2)
      --vm-cleanup          Restore VM to a previous state, before running tests
      --vm-timeout SECONDS  Amount of time (in seconds) to wait for a successful
                            connection to the virtual machine. Defaults to 120
                            seconds.

    wrapper support:
      --wrapper SCRIPT[:EXECUTABLE]
                            Use a script to wrap executables run by a test. The
                            wrapper is either a path to a script (AKA a global
                            wrapper) or a path to a script followed by colon
                            symbol (:), plus a shell like glob to the target
                            EXECUTABLE. Multiple wrapper options are allowed, but
                            only one global wrapper can be defined.

    yaml to mux options:
      -m [FILE [FILE ...]], --mux-yaml [FILE [FILE ...]]
                            Location of one or more Avocado multiplex (.yaml)
                            FILE(s) (order dependent)
      --mux-filter-only [MUX_FILTER_ONLY [MUX_FILTER_ONLY ...]]
                            Filter only path(s) from multiplexing
      --mux-filter-out [MUX_FILTER_OUT [MUX_FILTER_OUT ...]]
                            Filter out path(s) from multiplexing
      --mux-path [MUX_PATH [MUX_PATH ...]]
                            List of default paths used to determine path priority
                            when querying for parameters
      --mux-inject [MUX_INJECT [MUX_INJECT ...]]
                            Inject [path:]key:node values into the final multiplex
                            tree.

    yaml to mux options [deprecated]:
      --multiplex [FILE [FILE ...]]
                            DEPRECATED: Location of one or more Avocado multiplex
                            (.yaml) FILE(s) (order dependent)
      --filter-only [FILTER_ONLY [FILTER_ONLY ...]]
                            DEPRECATED: Filter only path(s) from multiplexing (use
                            --mux-filter-only instead)
      --filter-out [FILTER_OUT [FILTER_OUT ...]]
                            DEPRECATED: Filter out path(s) from multiplexing (use
                            --mux-filter-out instead)

Options for subcommand `config` (`avocado config --help`)::

    optional arguments:
      -h, --help            show this help message and exit
      --datadir             Shows the data directories currently being used by
                            avocado
      --paginator {on,off}  Turn the paginator on/off. Current: on


Options for subcommand `diff` (`avocado diff --help`)::

    positional arguments:
      <JOB>                 A job reference, identified by a (partial) unique ID
                            (SHA1) or test results directory.

    optional arguments:
      -h, --help            show this help message and exit
      --html FILE           Enable HTML output to the FILE where the result should
                            be written.
      --open-browser        Generate and open a HTML report in your preferred
                            browser. If no --html file is provided, create a
                            temporary file.
      --diff-filter DIFF_FILTER
                            Comma separated filter of diff sections:
                            (no)cmdline,(no)time,(no)variants,(no)results,
                            (no)config,(no)sysinfo (defaults to all enabled).
      --paginator {on,off}  Turn the paginator on/off. Current: on
      --create-reports      Create temporary files with job reports (to be used by
                            other diff tools)

Options for subcommand `distro` (`avocado distro --help`)::

    optional arguments:
      -h, --help            show this help message and exit
      --distro-def-create   Creates a distro definition file based on the path
                            given
      --distro-def-name DISTRO_DEF_NAME
                            Distribution short name
      --distro-def-version DISTRO_DEF_VERSION
                            Distribution major version number
      ---distro-def-release DISTRO_DEF_RELEASE
                            Distribution release version number
      --distro-def-arch DISTRO_DEF_ARCH
                            Primary architecture that the distro targets
      --distro-def-path DISTRO_DEF_PATH
                            Top level directory of the distro installation files
      --distro-def-type {deb,rpm}
                            Distro type (one of: deb, rpm)

Options for subcommand `exec-path` (`avocado exec-path --help`)::

    optional arguments:
      -h, --help  show this help message and exit

Options for subcommand `list` (`avocado list --help`)::

    positional arguments:
      reference             List of test references (aliases or paths). If empty,
                            avocado will list tests on the configured test source,
                            (see 'avocado config --datadir') Also, if there are
                            other test loader plugins active, tests from those
                            plugins might also show up (behavior may vary among
                            plugins)

    optional arguments:
      -h, --help            show this help message and exit
      -V, --verbose         Whether to show extra information (headers and
                            summary). Current: False
      --paginator {on,off}  Turn the paginator on/off. Current: on

    loader options:
      --loaders [LOADERS [LOADERS ...]]
                            Overrides the priority of the test loaders. You can
                            specify either @loader_name or TEST_TYPE. By default
                            it tries all available loaders according to priority
                            set in settings->plugins.loaders.
      --external-runner EXECUTABLE
                            Path to an specific test runner that allows the use of
                            its own tests. This should be used for running tests
                            that do not conform to Avocado' SIMPLE testinterface
                            and can not run standalone. Note: the use of
                            --external-runner overwrites the --loaders to
                            "external_runner"
      --external-runner-chdir {runner,test}
                            Change directory before executing tests. This option
                            may be necessary because of requirements and/or
                            limitations of the external test runner. If the
                            external runner requires to be run from its own base
                            directory,use "runner" here. If the external runner
                            runs tests based on files and requires to be run from
                            the directory where those files are located, use
                            "test" here and specify the test directory with the
                            option "--external-runner-testdir". Defaults to "None"
      --external-runner-testdir DIRECTORY
                            Where test files understood by the external test
                            runner are located in the filesystem. Obviously this
                            assumes and only applies to external test runners that
                            run tests from files

    filtering parameters:
      --filter-by-tags TAGS
                            Filter INSTRUMENTED tests based on ":avocado:
                            tags=tag1,tag2" notation in their class docstring
      --filter-by-tags-include-empty
                            Include all tests without tags during filtering. This
                            effectively means they will be kept in the test suite
                            found previously to filtering.

Options for subcommand `multiplex` (`avocado multiplex --help`)::

    optional arguments:
      -h, --help            show this help message and exit
      --summary SUMMARY     Verbosity of the variants summary. (positive integer -
                            0, 1, ... - or none, brief, normal, verbose, full,
                            max)
      --variants VARIANTS   Verbosity of the list of variants. (positive integer -
                            0, 1, ... - or none, brief, normal, verbose, full,
                            max)
      --system-wide         Combine the files with the default tree.
      -c, --contents        [obsoleted by --variants] Shows the node content
                            (variables)

    environment view options:
      -d, --debug           Debug the multiplex tree.

    tree view options:
      -t, --tree            [obsoleted by --summary] Shows the multiplex tree
                            structure
      -i, --inherit         [obsoleted by --summary] Show the inherited values

    yaml to mux options:
      -m [FILE [FILE ...]], --mux-yaml [FILE [FILE ...]]
                            Location of one or more Avocado multiplex (.yaml)
                            FILE(s) (order dependent)
      --mux-filter-only [MUX_FILTER_ONLY [MUX_FILTER_ONLY ...]]
                            Filter only path(s) from multiplexing
      --mux-filter-out [MUX_FILTER_OUT [MUX_FILTER_OUT ...]]
                            Filter out path(s) from multiplexing
      --mux-path [MUX_PATH [MUX_PATH ...]]
                            List of default paths used to determine path priority
                            when querying for parameters
      --mux-inject [MUX_INJECT [MUX_INJECT ...]]
                            Inject [path:]key:node values into the final multiplex
                            tree.

    yaml to mux options [deprecated]:
      --multiplex [FILE [FILE ...]]
                            DEPRECATED: Location of one or more Avocado multiplex
                            (.yaml) FILE(s) (order dependent)
      --filter-only [FILTER_ONLY [FILTER_ONLY ...]]
                            DEPRECATED: Filter only path(s) from multiplexing (use
                            --mux-filter-only instead)
      --filter-out [FILTER_OUT [FILTER_OUT ...]]
                            DEPRECATED: Filter out path(s) from multiplexing (use
                            --mux-filter-out instead)

Options for subcommand `plugins` (`avocado plugins --help`)::

    optional arguments:
      -h, --help            show this help message and exit
      --paginator {on,off}  Turn the paginator on/off. Current: on

Options for subcommand `sysinfo` (`avocado sysinfo --help`)::

    positional arguments:
      sysinfodir  Dir where to dump sysinfo

    optional arguments:
      -h, --help  show this help message and exit
466

C
Cleber Rosa 已提交
467 468 469
RUNNING A TEST
==============

A
Amador Pahim 已提交
470 471
The most common use of the `avocado` command line tool is to run a
test::
C
Cleber Rosa 已提交
472

A
Amador Pahim 已提交
473
    $ avocado run sleeptest.py
C
Cleber Rosa 已提交
474

A
Amador Pahim 已提交
475 476
This command will run the `sleeptest.py` test, as found on the standard
test directories. The output should be similar to::
C
Cleber Rosa 已提交
477

A
Amador Pahim 已提交
478 479 480 481 482
    JOB ID    : <id>
    JOB LOG   : /home/<user>/avocado/job-results/job-<date>-<shortid>/job.log
     (1/1) sleeptest.py:SleepTest.test: PASS (1.01 s)
    RESULTS    : PASS 1 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
    TESTS TIME : 1.01 s
C
Cleber Rosa 已提交
483

A
Amador Pahim 已提交
484 485 486
The test directories will vary depending on you system and installation
method used. Still, it's pretty easy to find that out as shown in the
next section.
C
Cleber Rosa 已提交
487

488 489 490
DEBUGGING TESTS
===============

A
Amador Pahim 已提交
491 492 493 494
When you are developing new tests, frequently you want to look at the
straight output of the job log in the stdout, without having to tail the
job log. In order to do that, you can use --show-job-log to the avocado
test runner::
495 496

    $ scripts/avocado run examples/tests/sleeptest.py --show-job-log
A
Amador Pahim 已提交
497 498 499 500
    ...
    PARAMS (key=timeout, path=*, default=None) => None
    START 1-sleeptest.py:SleepTest.test
    PARAMS (key=sleep_length, path=*, default=1) => 1
501 502
    Sleeping for 1.00 seconds
    Not logging /var/log/messages (lack of permissions)
A
Amador Pahim 已提交
503 504
    PASS 1-sleeptest.py:SleepTest.test
    ...
505

A
Amador Pahim 已提交
506 507 508 509
Let's say you are debugging a test particularly large, with lots of
debug output and you want to reduce this output to only messages with
level 'INFO' and higher. You can set job-log-level to info to reduce the
amount of output.
510

511 512 513 514 515 516 517 518
Edit your `~/.config/avocado/avocado.conf` file and add::

    [job.output]
    loglevel = info

Running the same example with this option will give you::

    $ scripts/avocado run sleeptest --show-job-log
A
Amador Pahim 已提交
519 520 521 522
    ...
    START 1-sleeptest.py:SleepTest.test
    PASS 1-sleeptest.py:SleepTest.test
    ...
523

A
Amador Pahim 已提交
524 525 526 527
The levels you can choose are the levels available in the python logging
system `https://docs.python.org/2/library/logging.html#logging-levels`,
translated to lowercase strings, so 'notset', 'debug', 'info',
'warning', 'error', 'critical', in order of severity.
528

529 530 531
As you can see, the UI output is suppressed and only the job log goes to
stdout, making this a useful feature for test development/debugging.

532 533 534
SILENCING RUNNER STDOUT
=======================

A
Amador Pahim 已提交
535 536 537 538 539
You may specify `--silent`, that means avocado will turn off all runner
stdout. Even if you specify things like `--show-job-log` in the CLI,
`--silent` will have precedence and you will not get application stdout.
Note that `--silent` does not affect on disk job logs, those continue to
be generated normally.
540

541 542 543 544
SILENCING SYSINFO REPORT
========================

You may specify --sysinfo=off and avocado will not collect profilers,
A
Amador Pahim 已提交
545 546
hardware details and other system information, inside the job result
directory.
547

C
Cleber Rosa 已提交
548 549 550
LISTING TESTS
=============

A
Amador Pahim 已提交
551 552 553 554 555 556
The `avocado` command line tool also has a `list` command, that lists
the known tests in a given path, be it a path to an individual test, or
a path to a directory. If no arguments provided, avocado will inspect
the contents of the test location being used by avocado (if you are in
doubt about which one is that, you may use `avocado config --datadir`).
The output looks like::
557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579

    $ avocado list
    INSTRUMENTED /usr/share/avocado/tests/abort.py
    INSTRUMENTED /usr/share/avocado/tests/datadir.py
    INSTRUMENTED /usr/share/avocado/tests/doublefail.py
    INSTRUMENTED /usr/share/avocado/tests/doublefree.py
    INSTRUMENTED /usr/share/avocado/tests/errortest.py
    INSTRUMENTED /usr/share/avocado/tests/failtest.py
    INSTRUMENTED /usr/share/avocado/tests/fiotest.py
    INSTRUMENTED /usr/share/avocado/tests/gdbtest.py
    INSTRUMENTED /usr/share/avocado/tests/gendata.py
    INSTRUMENTED /usr/share/avocado/tests/linuxbuild.py
    INSTRUMENTED /usr/share/avocado/tests/multiplextest.py
    INSTRUMENTED /usr/share/avocado/tests/passtest.py
    INSTRUMENTED /usr/share/avocado/tests/skiptest.py
    INSTRUMENTED /usr/share/avocado/tests/sleeptenmin.py
    INSTRUMENTED /usr/share/avocado/tests/sleeptest.py
    INSTRUMENTED /usr/share/avocado/tests/synctest.py
    INSTRUMENTED /usr/share/avocado/tests/timeouttest.py
    INSTRUMENTED /usr/share/avocado/tests/trinity.py
    INSTRUMENTED /usr/share/avocado/tests/warntest.py
    INSTRUMENTED /usr/share/avocado/tests/whiteboard.py

A
Amador Pahim 已提交
580 581 582 583 584
Here, `INSTRUMENTED` means that the files there are python files with an
avocado test class in them, therefore, that they are what we call
instrumented tests. This means those tests can use all avocado APIs and
facilities. Let's try to list a directory with a bunch of executable
shell scripts::
585 586 587 588 589 590 591 592 593

    $ avocado list examples/wrappers/
    SIMPLE examples/wrappers/dummy.sh
    SIMPLE examples/wrappers/ltrace.sh
    SIMPLE examples/wrappers/perf.sh
    SIMPLE examples/wrappers/strace.sh
    SIMPLE examples/wrappers/time.sh
    SIMPLE examples/wrappers/valgrind.sh

A
Amador Pahim 已提交
594 595 596 597 598
Here, `SIMPLE` means that those files are executables, that avocado will
simply execute and return PASS or FAIL depending on their return codes
(PASS -> 0, FAIL -> any integer different than 0). You can also provide
the `--verbose`, or `-V` flag to display files that were detected but
are not avocado tests, along with summary information::
599 600 601 602 603 604 605 606 607 608 609

    $ avocado list examples/gdb-prerun-scripts/ -V
    Type       file
    NOT_A_TEST examples/gdb-prerun-scripts/README
    NOT_A_TEST examples/gdb-prerun-scripts/pass-sigusr1

    SIMPLE: 0
    INSTRUMENTED: 0
    MISSING: 0
    NOT_A_TEST: 2

A
Amador Pahim 已提交
610 611 612
That summarizes the basic commands you should be using more frequently
when you start with avocado. Let's talk now about how avocado stores
test results.
C
Cleber Rosa 已提交
613 614 615 616 617 618

EXPLORING RESULTS
=================

When `avocado` runs tests, it saves all its results on your system::

A
Amador Pahim 已提交
619 620
    JOB ID    : <id>
    JOB LOG   : /home/<user>/avocado/job-results/job-<date>-<shortid>/job.log
C
Cleber Rosa 已提交
621 622

For your convenience, `avocado` maintains a link to the latest job run
A
Amador Pahim 已提交
623 624
(an `avocado run` command in this context), so you can always use
`"latest"` to browse your test results::
C
Cleber Rosa 已提交
625

A
Amador Pahim 已提交
626 627 628 629 630 631 632 633 634
    $ ls /home/<user>/avocado/job-results/latest
    id
    jobdata
    job.log
    results.json
    results.tap
    results.xml
    sysinfo
    test-results
C
Cleber Rosa 已提交
635

A
Amador Pahim 已提交
636 637
The main log file is `job.log`, but every test has its own results
directory::
C
Cleber Rosa 已提交
638

A
Amador Pahim 已提交
639 640
    $ ls -1 ~/avocado/job-results/latest/test-results/
    1-sleeptest.py:SleepTest.test
C
Cleber Rosa 已提交
641 642 643

Since this is a directory, it should have content similar to::

A
Amador Pahim 已提交
644 645 646 647 648 649 650 651
    $ ls -1 ~/avocado/job-results/latest/test-results/1-sleeptest.py\:SleepTest.test/
    data
    debug.log
    remote.log
    stderr
    stdout
    sysinfo
    whiteboard
C
Cleber Rosa 已提交
652 653 654 655

MULTIPLEX
=========

A
Amador Pahim 已提交
656 657 658 659
Avocado has a powerful tool that enables multiple test scenarios to be
run using a single, unmodified test. This mechanism uses a YAML file
called the 'multiplex file', that tells avocado how to multiply all
possible test scenarios automatically.
C
Cleber Rosa 已提交
660 661

A command by the same name, `multiplex`, is available on the `avocado`
A
Amador Pahim 已提交
662 663
command line tool, and enables you to see all the test scenarios that
can be run::
C
Cleber Rosa 已提交
664

A
Amador Pahim 已提交
665 666
    $ avocado multiplex -m examples/tests/sleeptest.py.data/sleeptest.yaml -c
    Variants generated:
667

A
Amador Pahim 已提交
668 669
    Variant 1:    /run/short
        /run/short:sleep_length => 0.5
670

A
Amador Pahim 已提交
671 672
    Variant 2:    /run/medium
        /run/medium:sleep_length => 1
673

A
Amador Pahim 已提交
674 675
    Variant 3:    /run/long
        /run/long:sleep_length => 5
676

A
Amador Pahim 已提交
677 678
    Variant 4:    /run/longest
        /run/longest:sleep_length => 10
679

A
Amador Pahim 已提交
680 681 682 683
This is a sample that varies the parameter `sleep_length` through the
scenarios ``/run/short`` (sleeps for 0.5 s), ``/run/medium`` (sleeps for
1 s), ``/run/long`` (sleeps for 5s), ``/run/longest`` (sleeps for 10s).
The YAML file (multiplex file) that produced the output above is::
684

A
Amador Pahim 已提交
685 686 687 688 689 690 691 692 693
    !mux
    short:
        sleep_length: 0.5
    medium:
        sleep_length: 1
    long:
        sleep_length: 5
    longest:
        sleep_length: 10
C
Cleber Rosa 已提交
694

A
Amador Pahim 已提交
695
You can execute `sleeptest` in all variations exposed above with::
696

A
Amador Pahim 已提交
697
    $ avocado run sleeptest.py -m examples/tests/sleeptest.py.data/sleeptest.yaml
C
Cleber Rosa 已提交
698 699 700

And the output should look like::

A
Amador Pahim 已提交
701 702 703 704 705 706 707 708
    JOB ID    : <id>
    JOB LOG   : /home/<user>/avocado/job-results/job-<date>-<shortid>/job.log
     (1/4) sleeptest.py:SleepTest.test;1: PASS (0.51 s)
     (2/4) sleeptest.py:SleepTest.test;2: PASS (1.01 s)
     (3/4) sleeptest.py:SleepTest.test;3: PASS (5.02 s)
     (4/4) sleeptest.py:SleepTest.test;4: PASS (10.01 s)
    RESULTS    : PASS 4 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
    TESTS TIME : 16.55 s
709 710

The `multiplex` plugin and the test runner supports two kinds of global
A
Amador Pahim 已提交
711 712 713 714
filters, through the command line options `--mux-filter-only` and
`--mux-filter-out`.
The `mux-filter-only` exclusively includes one or more paths and the
`mux-filter-out` removes one or more paths from being processed.
715

A
Amador Pahim 已提交
716 717
From the previous example, if we are interested to use the variants
`/run/medium` and `/run/longest`, we do the following command line::
718

A
Amador Pahim 已提交
719 720
    $ avocado run sleeptest.py -m examples/tests/sleeptest.py.data/sleeptest.yaml \
          --mux-filter-only /run/medium /run/longest
721 722 723 724

And if you want to remove `/small` from the variants created,
we do the following::

A
Amador Pahim 已提交
725 726
    $ avocado run sleeptest.py -m examples/tests/sleeptest.py.data/sleeptest.yaml \
          --mux-filter-out /run/medium
727

A
Amador Pahim 已提交
728 729
Note that both `--mux-filter-only` and `--mux-filter-out` filters can be
arranged in the same command line.
730

A
Amador Pahim 已提交
731 732 733 734 735 736
The multiplexer also supports default paths. The base path is ``/run/*``
but it can be overridden by ``--mux-path``, which accepts multiple
arguments. What it does: it splits leaves by the provided paths. Each
query goes one by one through those sub-trees and first one to hit the
match returns the result. It might not solve all problems, but it can
help to combine existing YAML files with your ones::
737

A
Amador Pahim 已提交
738
    qa: # large and complex read-only file, content injected into /qa
739 740 741
        tests:
            timeout: 10
        ...
A
Amador Pahim 已提交
742
    my_variants: !mux # your YAML file injected into /my_variants
743 744 745 746 747
        short:
            timeout: 1
        long:
            timeout: 1000

A
Amador Pahim 已提交
748 749 750
You want to use an existing test which uses
``params.get('timeout', '*')``.  Then you can use
``--mux-path '/my_variants/*' '/qa/*'`` and it'll first look in your
751 752
variants. If no matches are found, then it would proceed to ``/qa/*``

A
Amador Pahim 已提交
753 754
Keep in mind that only slices defined in mux-path are taken into account
for relative paths (the ones starting with ``*``).
C
Cleber Rosa 已提交
755

756 757
DEBUGGING EXECUTABLES RUN AS PART OF A TEST
===========================================
758 759

One interesting avocado feature is the ability to automatically and
760
transparently run executables that are used on a given test inside the
761 762 763 764 765 766 767 768
GNU debugger.

Suppose you are running a test that uses an external, compiled, image
converter. Now suppose you're feeding it with different types of images,
including broken image files, and it fails at a given point. You wish
you could connect to the debugger at that given source location while
your test is running. This is how to do just that with avocado::

A
Amador Pahim 已提交
769
    $ avocado run --gdb-run-bin=convert:convert_ppm_to_raw converttest.py
770 771 772

The job starts running just as usual, and so does your test::

A
Amador Pahim 已提交
773 774 775 776
    JOB ID    : <id>
    JOB LOG   : /home/<user>/avocado/job-results/job-<date>-<shortid>/job.log
    TESTS     : 1
     (1/1) converttest.py:ConvertTest.test: /
777

A
Amador Pahim 已提交
778 779
The `convert` executable though, automatically runs inside GDB. Avocado
will stop when the given breakpoint is reached::
780

A
Amador Pahim 已提交
781 782
    TEST PAUSED because of debugger breakpoint. To DEBUG your application run:
    /home/<user>/avocado/job-results/job-<date>-<shortid>/test-results/converttest.py/data/convert.gdb.sh
783

A
Amador Pahim 已提交
784
    NOTE: please use *disconnect* command in gdb before exiting, or else the debugged process will be KILLED
785 786 787 788

From this point, you can run the generated script (`convert.gdb.sh`) to
debug you application.

A
Amador Pahim 已提交
789 790 791 792
As noted, it is strongly recommended that you *disconnect* from gdb
while your executable is still running. That is, if the executable
finished running while you are debugging it, avocado has no way to know
about its status.
793 794 795 796

Avocado will automatically send a `continue` command to the debugger
when you disconnect from and exit gdb.

797
If, for some reason you have a custom GDB, or your system does not put
A
Amador Pahim 已提交
798 799 800
GDB on what avocado believes to be the standard location
(`/usr/bin/gdb`), you can override that in the section `gdb.paths` of
your documentation::
801

802 803 804
    [gdb.paths]
    gdb = /usr/bin/gdb
    gdbserver = /usr/bin/gdbserver
805

A
Amador Pahim 已提交
806 807
So running avocado after setting those will use the appropriate
gdb/gdbserver path.
808

A
Amador Pahim 已提交
809 810 811
If you are debugging a special application and need to setup GDB in
custom ways by running GDB commands, you can do that with the
`--gdb-prerun-commands` option::
812

A
Amador Pahim 已提交
813
    $ avocado run --gdb-run-bin=foo:bar --gdb-prerun-commands=/tmp/disable-signals footest.py
814

A
Amador Pahim 已提交
815 816
In this example, `/tmp/disable-signals` is a simple text file containing
two lines::
817

A
Amador Pahim 已提交
818 819
    signal SIGUSR1 pass
    signal SIGUSR1 nostop
820 821

Each line is a GDB command, so you can have from simple to very complex
822
debugging environments configured like that.
823

824 825
WRAP EXECUTABLE RUN BY TESTS
============================
826

827 828 829
Avocado allows the instrumentation of executables being run by a test
in a transparent way. The user specifies a script ("the wrapper") to be
used to run the actual program called by the test.
830

831 832 833 834
If the instrumentation script is implemented correctly, it should not
interfere with the test behavior. That is, the wrapper should avoid
changing the return status, standard output and standard error messages
of the original executable.
835

A
Amador Pahim 已提交
836 837
The user can be specific about which program to wrap (with a shell-like
glob), or if that is omitted, a global wrapper that will apply to all
838
programs called by the test.
839

840 841 842
So, for every executable run by the test, the program name will be
compared to the pattern to decide whether to wrap it or not. You can
have multiples wrappers and patterns defined.
843 844 845

Examples::

A
Amador Pahim 已提交
846
    $ avocado run datadir.py --wrapper examples/wrappers/strace.sh
847

A
Amador Pahim 已提交
848 849
Any command created by the test datadir will be wrapped on
``strace.sh``. ::
850

A
Amador Pahim 已提交
851 852
    $ avocado run datadir.py --wrapper examples/wrappers/ltrace.sh:*make \
                             --wrapper examples/wrappers/perf.sh:*datadir
853

A
Amador Pahim 已提交
854 855 856
Any command that matches the pattern `*make` will be wrapper on
``ltrace.sh`` and the pattern ``*datadir`` will trigger the execution of
``perf.sh``.
857

A
Amador Pahim 已提交
858 859
Note that it is not possible to use ``--gdb-run-bin`` together with
``--wrapper``, they are incompatible.
860

861 862
RUNNING TESTS WITH AN EXTERNAL RUNNER
=====================================
C
Cleber Rosa 已提交
863 864 865 866 867 868 869 870 871 872 873

It's quite common to have organically grown test suites in most
software projects. These usually include a custom built, very specific
test runner that knows how to find and run their own tests.

Still, running those tests inside Avocado may be a good idea for
various reasons, including being able to have results in different
human and machine readable formats, collecting system information
alongside those tests (the Avocado's `sysinfo` functionality), and
more.

A
Amador Pahim 已提交
874 875
Avocado makes that possible by means of its "external runner" feature.
The most basic way of using it is::
C
Cleber Rosa 已提交
876

877
    $ avocado run --external-runner=/path/to/external_runner foo bar baz
C
Cleber Rosa 已提交
878 879 880

In this example, Avocado will report individual test results for tests
`foo`, `bar` and `baz`. The actual results will be based on the return
881
code of individual executions of `/path/to/external_runner foo`,
A
Amador Pahim 已提交
882 883
`/path/to/external_runner bar` and finally
`/path/to/external_runner baz`.
C
Cleber Rosa 已提交
884 885

As another way to explain an show how this feature works, think of the
A
Amador Pahim 已提交
886 887
"external runner" as some kind of interpreter and the individual tests
as anything that this interpreter recognizes and is able to execute. A
888
UNIX shell, say `/bin/sh` could be considered an external runner, and
C
Cleber Rosa 已提交
889 890 891 892
files with shell code could be considered tests::

    $ echo "exit 0" > /tmp/pass
    $ echo "exit 1" > /tmp/fail
893
    $ avocado run --external-runner=/bin/sh /tmp/pass /tmp/fail
A
Amador Pahim 已提交
894 895
    JOB ID    : <id>
    JOB LOG   : /home/<user>/avocado/job-results/job-<date>-<shortid>/job.log
C
Cleber Rosa 已提交
896 897 898 899
    TESTS      : 2
    (1/2) /tmp/pass: PASS (0.01 s)
    (2/2) /tmp/fail: FAIL (0.01 s)
    RESULTS    : PASS 1 | ERROR 0 | FAIL 1 | SKIP 0 | WARN 0 | INTERRUPT 0
900
    TESTS TIME : 0.01 s
C
Cleber Rosa 已提交
901 902 903 904 905 906 907 908

This example is pretty obvious, and could be achieved by giving
`/tmp/pass` and `/tmp/fail` shell "shebangs" (`#!/bin/sh`), making
them executable (`chmod +x /tmp/pass /tmp/fail)`, and running them as
"SIMPLE" tests.

But now consider the following example::

909
    $ avocado run --external-runner=/bin/curl http://local-avocado-server:9405/jobs/ \
A
Amador Pahim 已提交
910 911 912
                                              http://remote-avocado-server:9405/jobs/
    JOB ID    : <id>
    JOB LOG   : /home/<user>/avocado/job-results/job-<date>-<shortid>/job.log
C
Cleber Rosa 已提交
913 914 915 916
    TESTS      : 2
    (1/2) http://local-avocado-server:9405/jobs/: PASS (0.02 s)
    (2/2) http://remote-avocado-server:9405/jobs/: FAIL (3.02 s)
    RESULTS    : PASS 1 | ERROR 0 | FAIL 1 | SKIP 0 | WARN 0 | INTERRUPT 0
917
    TESTS TIME : 3.04 s
C
Cleber Rosa 已提交
918

A
Amador Pahim 已提交
919 920 921
This effectively makes `/bin/curl` an "external test runner",
responsible for trying to fetch those URLs, and reporting PASS or FAIL
for each of them.
922

923 924 925
RECORDING TEST REFERENCE OUTPUT
===============================

A
Amador Pahim 已提交
926 927 928 929 930 931
As a tester, you may want to check if the output of a given application
matches an expected output. In order to help with this common use case,
we offer the option ``--output-check-record [mode]`` to the test runner.
If this option is used, it will store the stdout or stderr of the
process (or both, if you specified ``all``) being executed to reference
files: ``stdout.expected`` and ``stderr.expected``.
932

A
Amador Pahim 已提交
933 934 935 936
Those files will be recorded in the test data dir. The data dir is in
the same directory as the test source file, named
``[source_file_name.data]``. Let's take as an example the test
``synctest.py``. In a fresh checkout of avocado, you can see::
937 938 939 940 941 942 943 944 945 946

        examples/tests/synctest.py.data/stderr.expected
        examples/tests/synctest.py.data/stdout.expected

From those 2 files, only stdout.expected is non empty::

    $ cat examples/tests/synctest.py.data/stdout.expected
    PAR : waiting
    PASS : sync interrupted

A
Amador Pahim 已提交
947 948
The output files were originally obtained using the test runner and
passing the option --output-check-record all to the test runner::
949 950 951 952

    $ avocado run --output-check-record all examples/tests/synctest.py
    JOB ID    : <id>
    JOB LOG   : /home/<user>/avocado/job-results/job-<date>-<shortid>/job.log
A
Amador Pahim 已提交
953
     (1/1) examples/tests/synctest.py:SyncTest.test: PASS (4.00 s)
954
    RESULTS    : PASS 1 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
A
Amador Pahim 已提交
955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973
    TESTS TIME : 4.00 s

After the reference files are added, the check process is transparent,
in the sense that you do not need to provide special flags to the test
runner. Now, every time the test is executed, after it is done running,
it will check if the outputs are exactly right before considering the
test as PASSed. If you want to override the default behavior and skip
output check entirely, you may provide the flag ``--output-check=off``
to the test runner.

The ``avocado.utils.process`` APIs have a parameter
``allow_output_check`` (defaults to ``all``), so that you can select
which process outputs will go to the reference files, should you chose
to record them. You may choose ``all``, for both stdout and stderr,
``stdout``, for the stdout only, ``stderr``, for only the stderr only,
or ``none``, to allow neither of them to be recorded and checked.

This process works fine also with simple tests, executables that return
0 (PASSed) or != 0 (FAILed). Let's consider our bogus example::
974 975 976 977 978 979 980 981 982 983 984

    $ cat output_record.sh
    #!/bin/bash
    echo "Hello, world!"

Let's record the output (both stdout and stderr) for this one::

    $ avocado run output_record.sh --output-check-record all
    JOB ID    : <id>
    JOB LOG   : /home/<user>/avocado/job-results/job-<date>-<shortid>/job.log
    TESTS     : 1
985
    (1/1) home/$USER/Code/avocado/output_record.sh: PASS (0.01 s)
986
    RESULTS    : PASS 1 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
987
    TESTS TIME : 0.01 s
988 989 990 991 992 993 994 995 996 997 998 999 1000 1001

After this is done, you'll notice that a the test data directory
appeared in the same level of our shell script, containing 2 files::

    $ ls output_record.sh.data/
    stderr.expected  stdout.expected

Let's look what's in each of them::

    $ cat output_record.sh.data/stdout.expected
    Hello, world!
    $ cat output_record.sh.data/stderr.expected
    $

A
Amador Pahim 已提交
1002 1003
Now, every time this test runs, it'll take into account the expected
files that were recorded, no need to do anything else but run the test.
1004

1005 1006 1007
RUNNING REMOTE TESTS
====================

A
Amador Pahim 已提交
1008 1009 1010 1011
Avocado allows you to execute tests on a remote machine by means of a
SSH network connection. The remote machine must be configured to accept
remote connections and the Avocado framework have to be installed in
both origin and remote machines.
1012

A
Amador Pahim 已提交
1013 1014 1015 1016
When running tests on remote machine, the test sources and its data (if 
any present) are transferred to the remote target, just before the test
execution. After the test execution, all test results are transferred 
back to the origin machine.
1017 1018 1019 1020 1021

Here is how to run the sleeptest example test in a remote machine with IP
address 192.168.0.123 (standard port 22), remote user name `fedora` and
remote user password `123456`::

A
Amador Pahim 已提交
1022
    $ avocado run sleeptest.py --remote-hostname 192.168.0.123 --remote-username fedora --remote-password 123456
1023 1024 1025

The output should look like::

A
Amador Pahim 已提交
1026 1027 1028 1029 1030 1031
    JOB ID    : <id>
    JOB LOG   : /home/<user>/avocado/job-results/job-<date>-<shortid>/job.log
    LOGIN      : fedora@localhost:22 (TIMEOUT: 60 seconds)
     (1/1) sleeptest.py:SleepTest.test: PASS (1.02 s)
    RESULTS    : PASS 1 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
    TESTS TIME : 1.02 s
1032 1033 1034 1035

For more information, please consult the topic Remote Machine Plugin
on Avocado's online documentation.

1036 1037 1038
LINUX DISTRIBUTION UTILITIES
============================

A
Amador Pahim 已提交
1039 1040 1041
Avocado has some planned features that depend on knowing the Linux
Distribution being used on the system. The most basic command prints the
detected Linux Distribution::
1042

A
Amador Pahim 已提交
1043 1044
    $ avocado distro
    Detected distribution: fedora (x86_64) version 21 release 0
1045

A
Amador Pahim 已提交
1046 1047
Other features are available with the same command when command line
options are given, as shown by the `--help` option.
1048

A
Amador Pahim 已提交
1049 1050 1051 1052
For instance, it possible to create a so-called "Linux Distribution
Definition" file, by inspecting an installation tree. The installation
tree could be the contents of the official installation ISO or a local
network mirror.
1053

A
Amador Pahim 已提交
1054 1055 1056 1057 1058
These files let Avocado pinpoint if a given installed package is part of
the original Linux Distribution or something else that was installed
from an external repository or even manually. This, in turn, can help
detecting regressions in base system pacakges that affected a given test
result.
1059 1060 1061

To generate a definition file run::

A
Amador Pahim 已提交
1062 1063 1064
    $ avocado distro --distro-def-create --distro-def-name avocadix  \
                     --distro-def-version 1 --distro-def-arch x86_64 \
                     --distro-def-type rpm --distro-def-path /mnt/dvd
1065 1066 1067

And the output will be something like::

A
Amador Pahim 已提交
1068 1069
    Loading distro information from tree... Please wait...
    Distro information saved to "avocadix-1-x86_64.distro"
1070

1071

C
Cleber Rosa 已提交
1072 1073 1074 1075 1076
FILES
=====

::

A
Amador Pahim 已提交
1077 1078 1079 1080 1081 1082 1083 1084
    System wide configuration file
        /etc/avocado/avocado.conf

    Extra configuration files
        /etc/avocado/conf.d/

    User configuration file
        ~/.config/avocado/avocado.conf
C
Cleber Rosa 已提交
1085 1086 1087 1088

BUGS
====

A
Amador Pahim 已提交
1089 1090
If you find a bug, please report it over our github page as an issue:
`https://github.com/avocado-framework/avocado/issues`
C
Cleber Rosa 已提交
1091

1092
LICENSE
L
Lucas Meneghel Rodrigues 已提交
1093
=======
1094 1095

Avocado is released under GPLv2 (explicit version)
A
Amador Pahim 已提交
1096 1097 1098 1099 1100
`http://gnu.org/licenses/gpl-2.0.html`. Even though most of the current
code is licensed under a "and any later version" clause, some parts are
specifically bound to the version 2 of the license and therefore that's
the official license of the prject itself. For more details, please see
the LICENSE file in the project source code directory.
1101

C
Cleber Rosa 已提交
1102 1103 1104
MORE INFORMATION
================

1105 1106 1107
For more information please check Avocado's project website, located at
`http://avocado-framework.github.io/`. There you'll find links to online
documentation, source code and community resources.
C
Cleber Rosa 已提交
1108 1109 1110 1111

AUTHOR
======

1112
Avocado Development Team <avocado-devel@redhat.com>