Skip to content
Snippets Groups Projects
AutoTest 4.77 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/bin/sh
    #------------------------------------------------------------------------------
    # =========                 |
    # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    #  \\    /   O peration     |
    #   \\  /    A nd           | www.openfoam.com
    #    \\/     M anipulation  |
    #------------------------------------------------------------------------------
    #     Copyright (C) 2020 OpenCFD Ltd.
    #------------------------------------------------------------------------------
    # License
    #     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
    #
    # Script
    #     tutorials/AutoTest dir [.. dirN]
    #
    # Description
    #     Run foamRunTutorials with specified tutorial directories
    #     Creates/destroys a temporary directory for each test.
    #
    # Environment
    #     Requires an initialized OpenFOAM environment.
    #
    # Note
    #     Potentially useful for debian autopkgtest
    #
    #------------------------------------------------------------------------------
    # Auto-detect from location
    #Unused# projectDir="$(\cd "$(dirname "${0%/*}")" && \pwd -L)"
    
    #------------------------------------------------------------------------------
    printHelp() {
        cat<<USAGE
    
    usage: ${0##*/} [OPTION] dir [.. dirN]
    
    options:
      -1            Modify case controlDict to run only one time step (default)
      -full         Do not modify controlDict (run tutorial to completion)
      -debian       Any modifications when running with autopkgtest
      -help         Print the usage
    
    Run foamRunTutorials with specified tutorial directories.
    Creates/destroys a temporary directory for each.
    
    USAGE
        exit 0 # A clean exit
    }
    
    # Report error and exit
    die()
    {
        exec 1>&2
        echo
        echo "Error encountered:"
        while [ "$#" -ge 1 ]; do echo "    $1"; shift; done
        echo
        echo "See '${0##*/} -help' for usage"
        echo
        exit 1
    }
    
    #------------------------------------------------------------------------------
    
    unset optDebian optVerbose
    optRunLimit=1
    
    # Parse options
    while [ "$#" -gt 0 ]
    do
        case "$1" in
        -h*)
            printHelp
            ;;
    
        -1)
            optRunLimit="${1#-}"
            ;;
    
        -full)
            unset optRunLimit
            ;;
    
        -debian)
            # Redirect stderr to stdout, if autopkgtest (tests/control)
            # does NOT use "Restrictions: allow-stderr"
            exec 2>&1
            ;;
    
        --)
            break
            ;;
    
        -*)
            die "unknown option $1"
            ;;
    
        *)
            break
            ;;
        esac
        shift
    done
    
    
    #------------------------------------------------------------------------------
    # Basic sanity checks
    
    [ -n "$FOAM_TUTORIALS" ] || export FOAM_TUTORIALS="$WM_PROJECT_DIR"/tutorials
    
    [ -d "${WM_PROJECT_DIR:?}" ] || die "No OpenFOAM environment: $WM_PROJECT_DIR"
    [ -d "$FOAM_TUTORIALS" ] || die "No OpenFOAM tutorials : $FOAM_TUTORIALS"
    
    
    #------------------------------------------------------------------------------
    
    #
    # Modify case controlDicts to run only one time step
    #
    modifyCaseControlDict()
    {
        for dict in $(find . -name "controlDict*" -type f)
        do
            cp -f "${dict}" "${dict}.orig"
            sed \
                -e 's/\(startFrom[ \t]*\)\([A-Za-z]*\);/\1 latestTime;/' \
                -e 's/\(stopAt[ \t]*\)\([A-Za-z]*\);/\1 nextWrite;/' \
                -e 's/\(writeControl[ \t]*\)\([A-Za-z]*\);/\1 timeStep;/' \
                -e 's/\(writeInterval[ \t]*\)\([-.0-9A-Za-z]*\);/\1 '"$optRunLimit"';/' \
                "${dict}.orig" > "${dict}"
        done
    }
    
    
    #------------------------------------------------------------------------------
    
    nTests="$#"
    nPassed=0
    
    for testdir in "$@"
    do
        testdir="${testdir#tutorials/}"
        testdir="$(echo "$testdir" | sed -e 's@^//*@@; s@//*$@@;')"
        suffix="$(echo "$testdir" | sed -e 's@//*@_@g')"
    
        if [ -n "$testdir" ] && [ -d "$FOAM_TUTORIALS/$testdir" ]
        then
        (
            echo "Run test: $testdir"
            set -e
    
            TESTDIR="$(mktemp --directory --suffix=".$suffix")"
            trap 'rm -rf $TESTDIR' 0 INT QUIT ABRT PIPE TERM
    
            cp -r "$FOAM_TUTORIALS/$testdir"/* "$TESTDIR"/
            cd "$TESTDIR"
    
            if [ -n "$optRunLimit" ]
            then
                set +e
                modifyCaseControlDict
                set -e
            fi
    
            nInput="$(ls | wc -l)"
            foamRunTutorials
            nOutput="$(ls | wc -l)"
    
            if [ "$nInput" = 0 ]
            then
                echo "No input for $testdir" 1>&2
                exit 1
            elif [ "$nOutput" = "$nInput" ]
            then
                echo "Run failure for $testdir" 1>&2
                exit 1
            else
                echo "run: OK"
            fi
        ) && nPassed=$((nPassed + 1))
    
        else
            echo "No tutorial: $testdir" 1>&2
        fi
    done
    
    
    if [ "$nTests" = 0 ]
    then
        die "No tests specified"
    elif [ "$nPassed" = "$nTests" ]
    then
        echo "Passed all $nTests tests"
    else
        echo "Passed $nPassed/$nTests tests" 1>&2
        exit 1
    fi
    
    #------------------------------------------------------------------------------