aboutsummaryrefslogtreecommitdiff
path: root/testlib.sh
blob: 2c01739cb740f26c801bc5321e1cc92306cf7fda (plain)
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
#!/bin/bash
# 2008 Junichi Uekawa <dancer@debian.org>

set -e 

# library for functional unit-testing in bash.

TESTLIB_FAILS=0
TESTLIB_TESTS=0

testlib_echo() {
    case "$1" in
	OK)
	    # no output is probably good.
    	    ;;
	FAIL)
	    shift
	    echo "[FAIL]" "$@" >&2 
	    TESTLIB_FAILS=$((TESTLIB_FAILS+1))
	    ;;
    esac
    TESTLIB_TESTS=$((TESTLIB_TESTS+1))
}

testlib_summary() {
    echo "$0: Ran ${TESTLIB_TESTS} tests and $((TESTLIB_TESTS - TESTLIB_FAILS)) succeeded, ${TESTLIB_FAILS} failed"
    if [ $TESTLIB_FAILS != 0 ]; then
	echo '================='
	echo 'Testsuite FAILED!'
	echo "  $0"
	echo '================='
	exit 1
    fi
    exit 0
}

# Create fake installed tree with basic config files.  Make sure you trap test
# script exit to call testlib_cleanup_env.  Optional arg is location of the
# pbuilder checkout to copy files from.
# this is where the env actually lives
testlib_env_root=""
testlib_setup_env() {
    local pbuilder_checkout abs_pbuilder_checkout r
    pbuilder_checkout="${1:-.}"
    abs_pbuilder_checkout="`cd $pbuilder_checkout; pwd`"

    if [ -n "$testlib_env_root" ]; then
        echo "testlib_setup_env called twice without testlib_cleanup_env" >&2
        testlib_cleanup_env
        exit 1
    fi

    # backup env vars
    testlib_env_oldhome="$HOME"
    testlib_env_oldroot="$PBUILDER_ROOT"

    testlib_env_root="`mktemp -dt`"
    # brevity
    r="$testlib_env_root"

    mkdir "$r"/etc
    touch "$r"/etc/pbuilderrc
    mkdir -p "$r"/usr/share/pbuilder
    cp "$pbuilder_checkout"/pbuilderrc "$r"/usr/share/pbuilder
    mkdir -p "$r"/usr/lib
    ln -s "$abs_pbuilder_checkout" "$r"/usr/lib/pbuilder
    export PBUILDER_ROOT="$r"
    # when running the testsuite within pbuilder, these env vars will have been
    # set by regular pbuilder commands, so we need to unset them as to allow
    # their default values to be recomputed relative to PBUILDER_ROOT
    unset PBUILDER_PKGLIBDIR PBUILDER_PKGDATADIR PBUILDER_SYSCONFDIR

    mkdir "$r"/home
    touch "$r"/home/.pbuilderrc
    export HOME="$r"/home
}

# Reverse the effect of testlib_setup_env.  Setup a trap handler in your tests
# on this function if you call testlib_setup_env.
testlib_cleanup_env() {
    if [ -z "$testlib_env_root" ]; then
        # nothing to do
        return
    fi
    rm -rf "$testlib_env_root"
    export PBUILDER_ROOT="$testlib_env_oldroot"
    export HOME="$testlib_env_oldhome"
    testlib_env_root=""
}

expect_success() {
    # run the test in subshell
    if (
	"$@"
	); then
	testlib_echo "OK" "$1" 
    else
	testlib_echo "FAIL" "$1" 
    fi
}

expect_fail() {
    # run the test in subshell
    if (
	"$@"
	); then
	testlib_echo "FAIL" "$1"
    else
	testlib_echo "OK" "$1"
    fi
}

expect_output() {
    # run the test in subshell
    local val result
    val="$1"; shift 
    result="$( ( "$@" 2>&1 ) )"|| true
    if [ "${result}" = "${val}" ]; then
	testlib_echo "OK" "$1"
    else
	testlib_echo "FAIL" "$1 reason: [${result}] != [${val}]" 
    fi
}

#   Write your functions test_xxxx and call them at the end with their expected result code:
# . ./testlib.sh
# expect_success test_success
# expect_success test_fail
# expect_success test_options "hello world"
# testlib_summary