summaryrefslogtreecommitdiffstatshomepage
path: root/lib/log.sh
blob: 74d4cc7505953bf6f7793acbf7b35819efd71028 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
# Copyright (c) 2026 Egor Tensin <egor@tensin.name>
# This file is part of the "test-harness" project.
# For details, see https://github.com/egor-tensin/test-harness
# Distributed under the MIT License.

log() {
    local msg
    for msg; do
        echo -e "$test_file | $msg" >&2
    done
}

log_run() {
    if [ "$#" -lt 1 ]; then
        log "usage: ${FUNCNAME[0]} ARGV0 [ARG...]"
        return 1
    fi

    local msg='Running:'
    msg="$msg$( printf -- ' %q' "$@" )"
    log "$msg"
}

fail() {
    local msg
    for msg; do
        log "FAIL: $msg"
    done
}

fail_details() {
    local msg
    for msg; do
        fail "    $msg"
    done
}

log_numof_tests_ok=0
log_numof_tests_failed=0
declare -a log_tests_failed=()
declare -A log_tests_should_fail=()

log_test_start() {
    if [ "$#" -ne 1 ]; then
        echo "usage: ${FUNCNAME[0]} TEST_FILE" >&2
        return 1
    fi

    local test_file="$1"

    if [ -n "${test_should_fail:-}" ]; then
        log_tests_should_fail["$test_file"]=1
    fi

    cat <<EOF >&2

======================================================================
TEST: $test_file
======================================================================
EOF

    log "Should fail: ${test_should_fail:-No}"
}

log_test_ok() {
    if [ "$#" -ne 1 ]; then
        echo "usage: ${FUNCNAME[0]} TEST_FILE" >&2
        return 1
    fi

    log_numof_tests_ok=$((log_numof_tests_ok + 1))

    cat <<EOF >&2
----------------------------------------------------------------------
OK: $1
----------------------------------------------------------------------
EOF
}

log_test_fail() {
    if [ "$#" -ne 1 ]; then
        echo "usage: ${FUNCNAME[0]} TEST_FILE" >&2
        return 1
    fi

    log_numof_tests_failed=$((log_numof_tests_failed + 1))
    log_tests_failed+=("$1")

    cat <<EOF >&2
----------------------------------------------------------------------
FAIL: $1
----------------------------------------------------------------------
EOF
}

log_test_finish() {
    if [ "$#" -ne 2 ]; then
        echo "usage: ${FUNCNAME[0]} TEST_FILE EXIT_CODE" >&2
        return 1
    fi

    local test_file="$1"
    local ret="$2"
    local test_should_fail
    test_should_fail="${log_tests_should_fail["$test_file"]:+x}"

    if [ "$ret" -eq 0 ] || [ -n "$test_should_fail" ]; then
        log_test_ok "$test_file"
    else
        log_test_fail "$test_file"
    fi
}

log_tests_summary() {
    cat <<EOF >&2

======================================================================
SUMMARY
======================================================================
OK:   $log_numof_tests_ok
FAIL: $log_numof_tests_failed
EOF

    local test_file
    for test_file in ${log_tests_failed[@]+"${log_tests_failed[@]}"}; do
        cat <<EOF >&2
FAIL: $test_file
EOF
    done

    cat <<EOF >&2
----------------------------------------------------------------------
EOF

    local ret=0
    [ "$log_numof_tests_failed" -gt 0 ] && ret=1

    return "$ret"
}