1function usage() {
2    echo "runs $TEST_NAME"
3    echo "\t -h help"
4    echo "\t -c [CLIENT64_SERVER64 | CLIENT32_SERVER32 | CLIENT64_SERVER32 | CLIENT32_SERVER64] configures whether to run 32-bit or 64-bit versions of the servers and client"
5    echo "\t -x [/ld/library/path32] set the LD_LIBRARY_PATH for servers32 and client32"
6    echo "\t -y [/ld/library/path64] set the LD_LIBRARY_PATH for servers64 and client64"
7}
8
9failed_test_cases=()
10
11function run_test() {
12    if [ $1 -eq 32 ]; then
13        CLIENT_PATH=$CLIENT_PATH32
14        LD_LIB_PATH_CLIENT=$LD_LIB_PATH32
15    else
16        CLIENT_PATH=$CLIENT_PATH64
17        LD_LIB_PATH_CLIENT=$LD_LIB_PATH64
18    fi
19
20    if [ $2 -eq 32 ]; then
21        SERVER_PATH=$SERVER_PATH32
22        LD_LIB_PATH_SERVER=$LD_LIB_PATH32
23    else
24        SERVER_PATH=$SERVER_PATH64
25        LD_LIB_PATH_SERVER=$LD_LIB_PATH64
26    fi
27
28    echo "Running $1-bit client with $2-bit servers"
29    echo "$LD_LIB_PATH_SERVER=$LD_LIB_PATH_SERVER"
30    LD_LIBRARY_PATH=$LD_LIB_PATH_SERVER:$LD_LIBRARY_PATH $SERVER_PATH &
31    SERVER_PID=$!
32    LD_LIBRARY_PATH=$LD_LIB_PATH_CLIENT:$LD_LIBRARY_PATH $CLIENT_PATH
33    if [ $? -ne 0 ]; then
34        failed_test_cases+=("$1-bit client with $2-bit servers")
35    fi
36    kill $SERVER_PID
37}
38
39function check_env() {
40    if [ -z ${TEST_NAME+x} ]; then
41        echo "TEST_NAME is unset";
42        exit 1
43    fi
44
45    if [ -z ${CLIENT_PATH32+x} ]; then
46        echo "CLIENT_PATH32 is unset";
47        exit 1
48    fi
49
50    if [ -z ${CLIENT_PATH64+x} ]; then
51        echo "CLIENT_PATH64 is unset";
52        exit 1
53    fi
54
55    if [ -z ${SERVER_PATH32+x} ]; then
56        echo "SERVER_PATH32 is unset";
57        exit 1
58    fi
59
60    if [ -z ${SERVER_PATH64+x} ]; then
61        echo "SERVER_PATH64 is unset";
62        exit 1
63    fi
64}
65
66#usage: run_all_tests server_path32 server_path64 client_path32 client_path64 test_name [-h/-c config/-x lib32/-y ldlib64]
67function run_all_tests() {
68    SERVER_PATH32=$1
69    SERVER_PATH64=$2
70    CLIENT_PATH32=$3
71    CLIENT_PATH64=$4
72    TEST_NAME=$5
73    check_env
74    shift 5
75
76    while getopts hc:x:y: opt;
77    do
78        case $opt in
79            h)
80                usage
81                exit 0
82                ;;
83            c)
84                case $OPTARG in
85                    CLIENT64_SERVER64)
86                        run_test 64 64
87                        ;;
88                    CLIENT32_SERVER32)
89                        run_test 32 32
90                        ;;
91                    CLIENT64_SERVER32)
92                        run_test 64 32
93                        ;;
94                    CLIENT32_SERVER64)
95                        run_test 32 64
96                        ;;
97                    *)
98                        echo "Error: unknown config value \"$OPTARG\""
99                        exit 1
100                        ;;
101                esac
102                exit 0
103                ;;
104            x)
105                LD_LIB_PATH32=$OPTARG
106                ;;
107            y)
108                LD_LIB_PATH64=$OPTARG
109                ;;
110            *)
111                echo "Error: unknown param \"$opt\""
112                usage
113                exit 1
114                ;;
115        esac
116    done
117
118    for i in 32 64
119        do
120            for j in 32 64
121                do
122                    run_test $i $j
123                done
124        done
125    count_failed_tests=${#failed_test_cases[@]}
126    echo "*********************************************************"
127    echo "    $TEST_NAME Final Summary:\n"
128    if [ $count_failed_tests -gt 0 ]; then
129        echo "    $TEST_NAME failed for the following cases:\n\t"
130        for each in "${failed_test_cases[@]}"
131            do
132                echo "\t$each"
133            done
134    else
135        echo "    $TEST_NAME passed for all cases!"
136    fi
137    echo "*********************************************************"
138
139    exit ${#failed_test_cases[@]}
140}
141