Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

#! __SH__
# Copyright 2012 Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
#   notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
#   notice, this list of conditions and the following disclaimer in the
#   documentation and/or other materials provided with the distribution.
# * Neither the name of Google Inc. nor the names of its contributors
#   may be used to endorse or promote products derived from this software
#   without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# \file atf-report.sh
# Kyua-based compatibility replacement for atf-report.


. "${KYUA_ATF_COMPAT_PKGDATADIR:-__PKGDATADIR__}/lib.subr"


# Gets the action identifier from the output of 'kyua test'.
#
# \param file The file that contains the output of 'kyua test'.  Can be
#     /dev/stdout.
#
# \post Prints the action identifier.
get_action() {
    local file="${1}"; shift
    grep '^Committed action ' "${file}" | cut -d ' ' -f 3
}


# Generates an HTML report.
#
# The original atf-report generates HTML reports that are made up of solely a
# single HTML page.  Because of this, such reports can be written directly to
# the file specified by the user.
#
# Because Kyua generates "rich" HTML reports (i.e. reports that consist of more
# than one HTML page), we cannot perfectly emulate atf-report.  Instead, we
# create an auxiliary directory to hold all the files, and then place a link to
# such files in the file specified by the user.  The drawback is that HTML
# reports sent to stdout are no longer possible.
#
# \param output_file The name of the file to which to write the HTML report.
#     This file will end up being a symlink to the real report.
report_html() {
    local output_file="${1}"; shift

    [ "${output_file}" != "/dev/stdout" ] || \
        lib_usage_error "Cannot write HTML reports to stdout"

    local dir="$(dirname "${output_file}")"
    local index_name="${output_file##*/}"
    local files_name="$(echo "${index_name}" | sed -e 's,\.[a-zA-Z]*$,,').files"

    kyua report-html --action="$(get_action /dev/stdin)" \
        --output="${dir}/${files_name}"

    echo "Pointing ${index_name} to ${files_name}/index.html"
    ( cd "${dir}" && ln -s "${files_name}/index.html" "${index_name}" )
}


# Genereates an XML report.
#
# For our compatibility purposes, we assume that the XML report is just an HTML
# report.
#
# \param output_file The name of the file to which to write the HTML report.
#     This file will end up being a symlink to the real report.
report_xml() {
    local output_file="${1}"; shift

    lib_warning "XML output not supported; generating HTML instead"
    report_html "${output_file}"
}


# Generates progressive textual reports.
#
# This wrapper attempts to emulate atf-report's ticker output by reading the
# output of 'kyua test' progressively and sending it to the screen as soon as it
# becomes available.  The tail of the 'kyua test' report that includes summaries
# for the run is suppressed and is replaced with the more-detailed output of
# 'kyua report'.
#
# \param output_file The name of the file to which to write the textual report.
#     Can be /dev/stdout.
report_ticker() {
    local output_file="${1}"; shift

    local print=yes
    while read line; do
        [ -n "${line}" ] || print=no

        if [ "${print}" = yes ]; then
            case "${line}" in
            Committed*)
                echo "${line}" >>"${Lib_TempDir}/output"
                ;;
            *)
                echo "${line}"
                ;;
            esac
        else
            echo "${line}" >>"${Lib_TempDir}/output"
        fi
    done

    kyua report --action="$(get_action "${Lib_TempDir}/output")" \
        --output="${output_file}"
}


# Generates a report based on an output specification.
#
# \param output_spec The format:file specification of the output.
report() {
    local output_spec="${1}"; shift

    local output_format="$(echo "${output_spec}" | cut -d : -f 1)"
    local output_file="$(echo "${output_spec}" | cut -d : -f 2)"
    [ "${output_file}" != - ] || output_file=/dev/stdout

    case "${output_format}" in
    html|ticker|xml)
        "report_${output_format}" "${output_file}"
        ;;

    *)
        lib_usage_error "Unknown output format '${output_format}'"
        ;;
    esac
}


# Prints program usage to stdout.
#
# \param progname The name of the program to use for the syntax help.
usage() {
    local progname="${1}"; shift
    echo "Usage: ${progname} [-o output-spec]"
}


# Entry point for the program.
#
# \param ... The user-provided arguments.
main()
{
    local output_spec="ticker:-"
    while getopts ':o:' arg "${@}"; do
        case "${arg}" in
        o)
            output_spec="${OPTARG}"
            ;;
        \?)
            lib_usage_error "Unknown option -${OPTARG}"
            ;;
        esac
    done
    shift $((${OPTIND} - 1))

    [ ${#} -eq 0 ] || lib_usage_error "No arguments allowed"

    lib_init_tempdir

    report "${output_spec}"

    lib_cleanup
}


main "${@}"