# Copyright (c) 2016 DENX Software Engineering GmbH
# Heiko Schocher <hs@denx.de>
#
# SPDX-License-Identifier:	GPL-2.0+
#

What is tbot ?
==============

tbot is a tool for executing testcases on boards.
Source code found on [1]
Based on DUTS [2]
written in python

Basic Ideas of tbot
===================
(see also the figure:
https://github.com/hsdenx/tbot/blob/master/doc/tbot_structure.png )

- Virtual laboratory (VL)
   VL is the basic environment that groups:
  - [a number of] boards - target devices on which tbot executes testcases.
  - one Lab PC

- Test case (TC):
  A piece of python code, which uses the tbot class from [1].
  Tbot provides functions for sending shell commands and parsing the
  shell commands output.
  Tbot waits endless for a shell commands end (detected through reading
  the consoles prompt).
  A TC can also call other TC-es.

  remark:
  Tbot not really waits endless, for a shell commands end, instead
  tbot starts a watchdog in the background, and if it triggers, tbot
  ends the TC as failed. In the tbot beginning there was a lot of
  timeouts / retry cases, but it turned out, that waiting endless
  is robust and easy ...

- Host PC (where tbot runs, currently only linux host tested)
  must not a powerful machine (For example [3], I use a
  raspberry pi for running tbot and buildbot)

- Lab PC:
  - Host PC connects through ssh to the Lab PC
    -> so it is possible to test boards, which
       are not at the same place as the Host PC.
       (Lab PC and Host PC can be the same of course)
       -> maybe we can setup a Testsystem, which does nightly
          U-Boot/Linux builds and test from current mainline U-Boot
          on boards wherever they are accessible.

  - necessary tasks a Lab PC must deliver:
    - connect to boards console through a shell command.
    - power on/off boards through a shell command
    - detect the current power state of a board through
      a shell command

  - optional tasks:
    - tftp server (for example loading images)
    - nfs server (used as rootfs for linux kernels)
    - Internet access for example for downloading
      U-Boot source with git.
    - toolchains installed for compiling source code

      -> a linux machine is preffered.

  - currently only Lab PC with an installed linux supported/tested.

- Boards(s):
  the boards on which shell commands are executed.

- Board state:
  equals to the software, the board is currently running.

  Currently tbot supports 2 board states:
    - "u-boot", if the board is running U-Boot
    - "linux", if the board is running a linux kernel

  It should be easy to add other board states to tbot, see
  https://github.com/hsdenx/tbot/tree/master/src/lab_api/state_[u-boot/linux].py

  A board state is detected through analysing the boards
  shell prompt. In linux, tbot sets a special tbot prompt,
  in U-Boot the prompt is static, and configurable in tbot through
  a board config file.

  A TC can say in which board state it want to send shell commands.
  Tbot tries to detect the current board state, if board is not in
  the requested  board state, tbot tries to switch into the correct
  state. If this fails, the TC fails.

  It is possible to switch in a single TC between board states.

- Events
  tbot creates while executing testcases so called events.
  After tbot ended with the testcase it can call event_backends,
  which convert the events to different formats. more info:

  https://github.com/hsdenx/tbot/blob/master/doc/README.event

  demo for a event backend:
  http://xeidos.ddns.net/tests/test_db_auslesen.php

- tbot cmdline parameters:

$ python2.7 src/common/tbot.py --help
Usage: tbot.py [options]

Options:
  -h, --help            show this help message and exit
  -c CFGFILE, --cfgfile=CFGFILE
                        the tbot common configfilename
  -l LOGFILE, --logfile=LOGFILE
                        the tbot logfilename, if default, tbot creates a
                        defaultnamelogfile
  -t TC, --testcase=TC  the testcase which should be run
  -v, --verbose         be verbose, print all read/write to stdout
  -w WORKDIR, --workdir=WORKDIR
                        set workdir, default os.getcwd()
$

tbot needs the following files for proper execution:

  - tbot board configuration file (option -c):
    A board configuration file contains settings tbot needs to
    connect to the Lab PC and board specific variable settings
    for testcases.

  - name of the logfile tbot creates (option -l)
    defaultname: 'log/' + now.strftime("%Y-%m-%d-%H-%M") + '.log'

  - tbots working directory (option -w)

  - the testcasename tbot executes (option -t)

You are interested and want to use tbot?
If so, please read on the file:
tools/tbot/README.install

If not read [3] ;-)

Heiko Schocher <hs@denx.de>
v1 2016.01.22

--------------
[1] https://github.com/hsdenx/tbot
[2] http://www.denx.de/wiki/DUTS/DUTSDocs
[3] automated Testsetup with buildbot and tbot doing cyclic tests
    (buildbot used for starting tbot TC and web presentation of the
     results, all testing done through tbot):
    http://xeidos.ddns.net/buildbot/tgrid
    Host PC in Letkes/hungary
    VL in munich/germany

    Fancy things are done here, for example:
    - http://xeidos.ddns.net/buildbot/builders/smartweb_dfu/builds/43/steps/shell/logs/tbotlog
      (I try to cleanup the logfile soon, so it is not so filled with crap ;-)
      A first step see here:
      http://xeidos.ddns.net/buildbot/builders/smartweb_dfu/builds/45/steps/shell/logs/tbotlog
      (same TC now with the new loglevel = 'CON' ... not yet perfect)
      Executed steps:
      - clone u-boot.git
      - set toolchain
      - get a list of patchwork patches from my U-Boots ToDo list
      - download all of them, and check them with checkpatch
        and apply them to u-boot.git
      - compile U-Boot for the smartweb board
      - install the resulting images on the smartweb board
      - boot U-boot
      - test DFU
      - more TC should be added here for testing U-Boot

    - automatic "git bisect"
      https://github.com/hsdenx/tbot/blob/master/src/tc/tc_board_git_bisect.py
      http://xeidos.ddns.net/buildbot/builders/tqm5200s/builds/3/steps/shell/logs/tbotlog

      If a current U-Boot image not works on the tqm5200 board
      this TC can be started. It starts a "git bisect" session,
      and compiles for each step U-Boot, install it on the tqm5200
      board, and tests if U-Boot works !

      At the end, it detects the commit, which breaks the board

      This TC is not dependend on U-Boot nor on a special board. It
      needs only 3 variables:
      tb.board_git_bisect_get_source_tc: TC which gets the source tree, in which
        "git bisect" should be executed
      tb.board_git_bisect_call_tc: TC which gets called every "git bisect" step,
        which executes commands for detecting if current source code is OK or not.
        This could be a TC which compiles U-Boot, install it on the board and
        executes TC on the new booted U-Boot image. ! Board maybe gets borken,
        as not all U-Boot images work, so you must have a TC which install U-Boot
        image for example through a debugger.
      tb.board_git_bisect_good_commit: last nown good commit id
