summaryrefslogtreecommitdiff
path: root/tests/ovs-macros.at
blob: 6c0f58dd8e45dc515e7844814b84616e3b2c77bf (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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
AT_TESTED([ovs-vswitchd])
AT_TESTED([ovs-vsctl])
AT_TESTED([perl])

m4_include([m4/compat.at])

dnl Make AT_SETUP automatically run the ovs_init() shell function
dnl as the first step in every test.
m4_rename([AT_SETUP], [OVS_AT_SETUP])
m4_define([AT_SETUP], [OVS_AT_SETUP($@)
ovs_init
])
m4_divert_push([PREPARE_TESTS])
[
# Set ovs_base to the base directory in which the test is running and
# initialize the OVS_*DIR environment variables to point to this
# directory.
ovs_init() {
    ovs_base=`pwd`
    trap '. "$ovs_base/cleanup"' 0
    : > cleanup
    ovs_setenv
}

# With no parameter or an empty parameter, sets the OVS_*DIR
# environment variables to point to $ovs_base, the base directory in
# which the test is running.
#
# With a parameter, sets them to $ovs_base/$1.
ovs_setenv() {
    sandbox=$1
    ovs_dir=$ovs_base${1:+/$1}
    OVS_RUNDIR=$ovs_dir; export OVS_RUNDIR
    OVS_LOGDIR=$ovs_dir; export OVS_LOGDIR
    OVS_DBDIR=$ovs_dir; export OVS_DBDIR
    OVS_SYSCONFDIR=$ovs_dir; export OVS_SYSCONFDIR
    OVS_PKGDATADIR=$ovs_dir; export OVS_PKGDATADIR
}

ovs_wait () {
    # First try the condition without waiting.
    ovs_wait_cond && return 0

    # Try a quick sleep, so that the test completes very quickly
    # in the normal case.  POSIX doesn't require fractional times to
    # work, so this might not work.
    sleep 0.1
    ovs_wait_cond && return 0

    # Then wait up to 10 seconds.
    for d in 0 1 2 3 4 5 6 7 8 9; do
        sleep 1
        ovs_wait_cond && return 0
    done
    return 1
}

# Prints the integers from $1 to $2, increasing by $3 (default 1) on stdout.
seq () {
    while test $1 -le $2; do
        echo $1
        set `expr $1 + ${3-1}` $2 $3
    done
}

if test "$IS_WIN32" = "yes"; then
    pwd () {
        command pwd -W "$@"
    }

    diff () {
        command diff --strip-trailing-cr "$@"
    }

    # tskill is more effective than taskkill but it isn't always installed.
    if (tskill //?) >/dev/null 2>&1; then :; else
        tskill () { taskkill //F //PID $1 >/dev/null; }
    fi

    kill () {
        signal=
        retval=0
        for arg; do
            case $arg in
            -*) signal=$arg ;;
            [1-9][0-9]*)
                # tasklist always returns 0.
                # If pid does exist, there will be a line with the pid.
                if tasklist //fi "PID eq $arg" | grep $arg >/dev/null; then
                    if test "X$signal" != "X-0"; then
                        tskill $arg
                    fi
                else
                    retval=1
                fi
                ;;
            esac
        done
        return $retval
    }
fi
]
m4_divert_pop([PREPARE_TESTS])

m4_define([OVS_WAIT], [dnl
ovs_wait_cond () {
    $1
}
if ovs_wait; then :
else
    $2
    AT_FAIL_IF([:])
fi
])

dnl OVS_WAIT_UNTIL(COMMAND)
dnl
dnl Executes shell COMMAND in a loop until it returns
dnl zero return code.  If COMMAND did not return
dnl zero code within reasonable time limit, then
dnl the test fails.
m4_define([OVS_WAIT_UNTIL], [OVS_WAIT([$1], [$2])])

dnl OVS_WAIT_WHILE(COMMAND)
dnl
dnl Executes shell COMMAND in a loop until it returns
dnl non-zero return code.  If COMMAND did not return
dnl non-zero code within reasonable time limit, then
dnl the test fails.
m4_define([OVS_WAIT_WHILE],
  [OVS_WAIT([if $1; then return 1; else return 0; fi], [$2])])

dnl OVS_APP_EXIT_AND_WAIT(DAEMON)
dnl
dnl Ask the daemon named DAEMON to exit, via ovs-appctl, and then waits for it
dnl to exit.
m4_define([OVS_APP_EXIT_AND_WAIT],
  [ovs-appctl -t $1 exit
   OVS_WAIT_WHILE([test -e $1.pid])])

dnl on_exit "COMMAND"
dnl
dnl Add the shell COMMAND to a collection executed when the current test
dnl completes, as a cleanup action.  (The most common use is to kill a
dnl daemon started by the test.  This is important to prevent tests that
dnl start daemons from hanging at exit.)
dnl
dnl Cleanup commands are executed in the reverse order of calls to this
dnl function.
m4_divert_text([PREPARE_TESTS], [dnl
on_exit () {
    (echo "$1"; cat cleanup) > cleanup.tmp
    mv cleanup.tmp cleanup
}
])

dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
m4_ifndef([AS_VAR_APPEND],
  [m4_divert_text([PREPARE_TESTS],
    [as_var_append () {
       eval $1=\$$1\$2
     }
])
   m4_define([AS_VAR_APPEND], [as_var_append $1 $2])])