blob: 6086ab83d57e218240b5560f7eacb3070937d7f8 [file] [log] [blame]
Roger Meier4d5157d2012-01-09 21:23:19 +00001#!/bin/sh
2#
3# Licensed to the Apache Software Foundation (ASF) under one
4# or more contributor license agreements. See the NOTICE file
5# distributed with this work for additional information
6# regarding copyright ownership. The ASF licenses this file
7# to you under the Apache License, Version 2.0 (the
8# "License"); you may not use this file except in compliance
9# with the License. You may obtain a copy of the License at
10#
11# http://www.apache.org/licenses/LICENSE-2.0
12#
13# Unless required by applicable law or agreed to in writing,
14# software distributed under the License is distributed on an
15# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16# KIND, either express or implied. See the License for the
17# specific language governing permissions and limitations
18# under the License.
19#
20
21# Apache Thrift - integration test suite
22#
23# tests different client-server, protocol and transport combinations
24
25# related issues:
26# THRIFT-847 Test Framework harmonization across all languages
27# THRIFT-819 add Enumeration for protocol, transport and server types
28
Roger Meiercc0fe272014-05-16 23:18:25 +020029START_TIME=$SECONDS
henriqued17f1c92014-04-30 16:21:25 +020030cd "$( dirname "$0" )"
31BASEDIR=$(pwd)
32
Roger Meier4d5157d2012-01-09 21:23:19 +000033print_header() {
34 printf "%-16s %-11s %-17s %-s\n" "client-server:" "protocol:" "transport:" "result:"
35}
36
Roger Meiercc0fe272014-05-16 23:18:25 +020037STATUS_HTML="status.html"
38
39print_html_header() {
40cat << EOF > $STATUS_HTML
41<!DOCTYPE HTML>
42<html>
43<head>
44<meta charset="utf-8">
45<title>Apache Thrift - integration test suite</title>
46<link rel="stylesheet" type="text/css" href="http://cdn.datatables.net/1.10.0/css/jquery.dataTables.css">
47<script type="text/javascript" charset="utf-8" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
48<script type="text/javascript" charset="utf-8" src="http://cdn.datatables.net/1.10.0/js/jquery.dataTables.js"></script>
49<script>
50 var test_data;
51 \$(document).ready( function () {
52 testTable = \$('#test_results').DataTable( {
53 data: test_data
54 });
55 \$('#test_results_filter label input')
56 .focus()
57 .val('failure');
58 });
59</script>
60</head>
61<body>
62<h2>Apache Thrift - integration test suite: Results</h2>
63<table id="test_results" class="display">
64 <thead>
65 <tr>
66 <th>Server</th>
67 <th>Client</th>
68 <th>Protocol</th>
69 <th>Transport</th>
70 <th>Result (log)</th>
71 </tr>
72 </thead>
73</table>
74<script>
75test_data = [
76EOF
77}
78
79print_html_footer() {
80duration=$1
81cat << EOF >> $STATUS_HTML
82]
83</script>
84<h2>Test Information</h2>
85<pre>
86Test Date: `date --iso-8601=seconds`
87Revision: `git rev-parse --short HEAD`
88OS: `uname -a`
89Test duration: $duration
90</pre>
91</body>
92</html>
93EOF
94}
95
Roger Meierf42ce2a2013-01-16 22:12:14 +010096intersection() {
97 return_value=""
98 for one in $1; do
99 for two in $2; do
100 if [ ${one} = ${two} ]; then
101 return_value=${return_value}" "${one}
102 fi
103 done;
104 done;
105 echo ${return_value};
106}
107
Roger Meier4d5157d2012-01-09 21:23:19 +0000108do_test () {
109 client_server=$1
110 protocol=$2
111 transport=$3
112 client_exec=$4
113 server_exec=$5
henriqued17f1c92014-04-30 16:21:25 +0200114 client_timeout=$6
115 server_startup_time=$7
Roger Meier4d5157d2012-01-09 21:23:19 +0000116
117 testname=${client_server}_${protocol}_${transport}
henriqued5aba4c2014-04-30 18:11:11 +0200118 server_timeout=$(echo "(${server_startup_time}+${client_timeout})" | bc)
Roger Meier4d5157d2012-01-09 21:23:19 +0000119 printf "%-16s %-11s %-17s" ${client_server} ${protocol} ${transport}
henriqued17f1c92014-04-30 16:21:25 +0200120
Roger Meier284101c2014-03-11 21:20:35 +0100121 timeout $server_timeout $server_exec > log/${testname}_server.log 2>&1 &
henriqued17f1c92014-04-30 16:21:25 +0200122 server_pid=$!
123
Roger Meier4d5157d2012-01-09 21:23:19 +0000124 sleep $server_startup_time
henriqued17f1c92014-04-30 16:21:25 +0200125 timeout $client_timeout $client_exec > log/${testname}_client.log 2>&1
Ben Craigf41d79d2014-01-08 15:15:48 -0600126
Roger Meier4d5157d2012-01-09 21:23:19 +0000127 if [ "$?" -eq "0" ]; then
Roger Meiercc0fe272014-05-16 23:18:25 +0200128 result="success($?)"
129 echo " $result"
Roger Meier4d5157d2012-01-09 21:23:19 +0000130 else
Roger Meiercc0fe272014-05-16 23:18:25 +0200131 result="failure($?)"
132 echo " $result"
Roger Meier4edac7f2014-05-02 21:07:01 +0200133 # add details to the error.log
134 print_header >> log/error.log
135 printf "%-16s %-11s %-17s\n" ${client_server} ${protocol} ${transport} >> log/error.log
136 echo "=================== server message ===================" >> log/error.log
137 tail log/${testname}_server.log >> log/error.log
138 echo "=================== client message ===================" >> log/error.log
139 tail log/${testname}_client.log >> log/error.log
140 echo "======================================================" >> log/error.log
141 echo "" >> log/error.log
Roger Meier4d5157d2012-01-09 21:23:19 +0000142 fi
henriqued17f1c92014-04-30 16:21:25 +0200143
Roger Meiercc0fe272014-05-16 23:18:25 +0200144 # write json array
145 client_server=( ${client_server//[-]/ } )
146 server=${client_server[0]}
147 client=${client_server[1]}
148
149 cat << EOF >> $STATUS_HTML
150 [
151 "${client}",
152 "${server}",
153 "${protocol}",
154 "${transport}",
155 "${result} (<a href=\"log/${testname}_client.log\">client</a>, <a href=\"log/${testname}_server.log\">server</a>)"
156 ],
157EOF
158
henriqued17f1c92014-04-30 16:21:25 +0200159 # silently kill server
160 kill ${server_pid} 2>/dev/null && wait ${server_pid} 2>/dev/null
Roger Meier4d5157d2012-01-09 21:23:19 +0000161}
162
163echo "Apache Thrift - integration test suite"
164date
henriqued17f1c92014-04-30 16:21:25 +0200165
henriqued17f1c92014-04-30 16:21:25 +0200166
Roger Meier4d5157d2012-01-09 21:23:19 +0000167echo "======================================================"
168
169rm -rf log
170mkdir -p log
171
Roger Meiercc0fe272014-05-16 23:18:25 +0200172
Roger Meier4d5157d2012-01-09 21:23:19 +0000173print_header
Roger Meiercc0fe272014-05-16 23:18:25 +0200174print_html_header
175
176ant -f ../lib/java/build.xml compile-test 1>/dev/null
177
Roger Meier4d5157d2012-01-09 21:23:19 +0000178
Roger Meier82525772012-11-16 00:38:27 +0000179#TODO add enum for parameters
180#TODO align program arguments across languages
Roger Meier4d5157d2012-01-09 21:23:19 +0000181
Roger Meier023192f2014-02-12 09:35:12 +0100182cpp_protocols="binary compact json"
183java_protocols="binary compact json"
Roger Meierf42ce2a2013-01-16 22:12:14 +0100184cpp_transports="buffered framed http"
185java_server_transports="buffered framed fastframed"
186java_client_transports=${java_server_transports}" http"
Roger Meier4d5157d2012-01-09 21:23:19 +0000187# we need a test certificate first
Roger Meier5829a2c2014-04-08 00:28:17 +0200188cpp_sockets="ip domain ip-ssl"
Roger Meierf42ce2a2013-01-16 22:12:14 +0100189java_sockets="ip ip-ssl"
190# TODO fastframed java transport is another implementation of framed transport
Roger Meier4d5157d2012-01-09 21:23:19 +0000191
Roger Meier8909cbd2014-01-26 11:44:27 +0100192nodejs_protocols="binary json"
193nodejs_transports="buffered framed"
Roger Meier57b354b2014-02-22 01:01:58 +0100194nodejs_sockets="ip ip-ssl"
Roger Meiereaa61d82012-01-12 21:38:29 +0000195
Jens Geyerc1d79432014-04-22 22:52:43 +0200196csharp_protocols="binary compact json"
197csharp_transports="buffered framed"
198csharp_sockets="ip ip-ssl"
199
Roger Meierf42ce2a2013-01-16 22:12:14 +0100200
201######### java client - java server #############
202for proto in $java_protocols; do
203 for trans in $java_server_transports; do
204 for sock in $java_sockets; do
205 case "$sock" in
206 "ip" ) extraparam="";;
207 "ip-ssl" ) extraparam="--ssl";;
208 esac
209 do_test "java-java" "${proto}" "${trans}-${sock}" \
henriqued5aba4c2014-04-30 18:11:11 +0200210 "ant -f ../lib/java/build.xml -Dno-gen-thrift=\"\" -Dtestargs \"--protocol=${proto} --transport=${trans} ${extraparam}\" run-testclient" \
211 "ant -f ../lib/java/build.xml -Dno-gen-thrift=\"\" -Dtestargs \"--protocol=${proto} --transport=${trans} ${extraparam}\" run-testserver" \
212 "5" "1"
Roger Meierf42ce2a2013-01-16 22:12:14 +0100213 done
214 done
215done
216
217######### cpp client - cpp server ###############
218for proto in $cpp_protocols; do
219 for trans in $cpp_transports; do
220 for sock in $cpp_sockets; do
Roger Meier4d5157d2012-01-09 21:23:19 +0000221 case "$sock" in
222 "ip" ) extraparam="";;
223 "ip-ssl" ) extraparam="--ssl";;
224 "domain" ) extraparam="--domain-socket=/tmp/ThriftTest.thrift";;
225 esac
226 do_test "cpp-cpp" "${proto}" "${trans}-${sock}" \
227 "cpp/TestClient --protocol=${proto} --transport=${trans} ${extraparam}" \
228 "cpp/TestServer --protocol=${proto} --transport=${trans} ${extraparam}" \
henriqued5aba4c2014-04-30 18:11:11 +0200229 "2" "0.1"
Roger Meierf42ce2a2013-01-16 22:12:14 +0100230 done
231 done
232done
233
henriqued17f1c92014-04-30 16:21:25 +0200234
Roger Meierf42ce2a2013-01-16 22:12:14 +0100235######### java client - cpp server ##############
236# warning: ssl over http is not supported in java client!
237for proto in $(intersection "${java_protocols}" "${cpp_protocols}"); do
238 for trans in $(intersection "${java_client_transports}" "${cpp_transports}"); do
239 for sock in $(intersection "${java_sockets}" "${cpp_sockets}"); do
240 case "$sock" in
241 "ip" ) extraparam="";;
242 "ip-ssl" ) extraparam="--ssl";;
243 esac
Roger Meier188024e2014-04-17 21:53:45 +0200244 do_test "java-cpp" "${proto}" "${trans}-${sock}" \
henriqued5aba4c2014-04-30 18:11:11 +0200245 "ant -f ../lib/java/build.xml -Dno-gen-thrift=\"\" -Dtestargs \"--protocol=${proto} --transport=${trans} ${extraparam}\" run-testclient" \
Roger Meierf42ce2a2013-01-16 22:12:14 +0100246 "cpp/TestServer --protocol=${proto} --transport=${trans} ${extraparam}"\
henriqued5aba4c2014-04-30 18:11:11 +0200247 "5" "0.1"
Roger Meierf42ce2a2013-01-16 22:12:14 +0100248 done
249 done
250done
251
252######### cpp client - java server ##############
253for proto in $(intersection "${cpp_protocols}" "${java_protocols}"); do
254 for trans in $(intersection "${cpp_transports}" "${java_server_transports}"); do
255 for sock in $(intersection "${java_sockets}" "${cpp_sockets}"); do
256 case "$sock" in
257 "ip" ) extraparam="";;
258 "ip-ssl" ) extraparam="--ssl";;
259 esac
Roger Meier188024e2014-04-17 21:53:45 +0200260 do_test "cpp-java" "${proto}" "${trans}-${sock}" \
261 "cpp/TestClient --protocol=${proto} --transport=${trans} ${extraparam}" \
henriqued5aba4c2014-04-30 18:11:11 +0200262 "ant -f ../lib/java/build.xml -Dno-gen-thrift=\"\" -Dtestargs \"--protocol=${proto} --transport=${trans} ${extraparam}\" run-testserver" \
263 "5" "1"
Roger Meierf42ce2a2013-01-16 22:12:14 +0100264 done
265 done
266done
Roger Meier4d5157d2012-01-09 21:23:19 +0000267
Roger Meier8909cbd2014-01-26 11:44:27 +0100268
henriqued17f1c92014-04-30 16:21:25 +0200269NODE_TEST_DIR=${BASEDIR}/../lib/nodejs/test
Roger Meier8909cbd2014-01-26 11:44:27 +0100270export NODE_PATH=${NODE_TEST_DIR}:${NODE_TEST_DIR}/../lib:${NODE_PATH}
henriqued5aba4c2014-04-30 18:11:11 +0200271
Roger Meier8909cbd2014-01-26 11:44:27 +0100272######### nodejs client - cpp server ##############
273##
274for proto in $(intersection "${nodejs_protocols}" "${cpp_protocols}"); do
275 for trans in $(intersection "${nodejs_transports}" "${cpp_transports}"); do
276 for sock in $(intersection "${nodejs_sockets}" "${cpp_sockets}"); do
Roger Meier57b354b2014-02-22 01:01:58 +0100277 case "$sock" in
278 "ip" ) extraparam="";;
279 "ip-ssl" ) extraparam="--ssl";;
280 esac
henriqued17f1c92014-04-30 16:21:25 +0200281 do_test "nodejs-cpp" "${proto}" "${trans}-${sock}" \
282 "node ${NODE_TEST_DIR}/client.js -p ${proto} -t ${trans} ${extraparam}" \
Roger Meier8909cbd2014-01-26 11:44:27 +0100283 "cpp/TestServer --protocol=${proto} --transport=${trans} ${extraparam}" \
henriqued5aba4c2014-04-30 18:11:11 +0200284 "5" "0.2"
Roger Meier8909cbd2014-01-26 11:44:27 +0100285 done
286 done
287done
288
289######### cpp client - nodejs server ##############
290for proto in $(intersection "${nodejs_protocols}" "${cpp_protocols}"); do
291 for trans in $(intersection "${nodejs_transports}" "${cpp_transports}"); do
292 for sock in $(intersection "${nodejs_sockets}" "${cpp_sockets}"); do
Roger Meier57b354b2014-02-22 01:01:58 +0100293 case "$sock" in
294 "ip" ) extraparam="";;
295 "ip-ssl" ) extraparam="--ssl";;
296 esac
henriqued17f1c92014-04-30 16:21:25 +0200297 do_test "cpp-nodejs" "${proto}" "${trans}-${sock}" \
Roger Meier57b354b2014-02-22 01:01:58 +0100298 "cpp/TestClient --protocol=${proto} --transport=${trans} ${extraparam}" \
henriqued17f1c92014-04-30 16:21:25 +0200299 "node ${NODE_TEST_DIR}/server.js -p ${proto} -t ${trans} ${extraparam}" \
henriqued5aba4c2014-04-30 18:11:11 +0200300 "5" "2"
Roger Meier8909cbd2014-01-26 11:44:27 +0100301 done
302 done
303done
304
Roger Meier691ec002012-11-02 07:50:24 +0000305# delete Unix Domain Socket used by cpp tests
306rm -f /tmp/ThriftTest.thrift
307
Jens Geyerc1d79432014-04-22 22:52:43 +0200308######### csharp client - csharp server #############
309export MONO_PATH=../lib/csharp
310for proto in $csharp_protocols; do
311 for trans in $csharp_transports; do
312 for sock in $csharp_sockets; do
313 case "$sock" in
314 "ip" ) extraparam="";;
315 "ip-ssl" ) extraparam="--ssl";;
316 esac
317 do_test "csharp-csharp" "${proto}" "${trans}-${sock}" \
318 "../lib/csharp/test/ThriftTest/TestClientServer.exe client --protocol=${proto} --transport=${trans} ${extraparam}" \
319 "../lib/csharp/test/ThriftTest/TestClientServer.exe server --protocol=${proto} --transport=${trans} ${extraparam}" \
henriqued5aba4c2014-04-30 18:11:11 +0200320 "5" "1"
Jens Geyerc1d79432014-04-22 22:52:43 +0200321 done
322 done
323done
324
325
Roger Meier85fb6de2012-11-02 00:05:42 +0000326do_test "py-py" "binary" "buffered-ip" \
327 "py/TestClient.py --proto=binary --port=9090 --host=localhost --genpydir=py/gen-py" \
328 "py/TestServer.py --proto=binary --port=9090 --genpydir=py/gen-py TSimpleServer" \
henriqued5aba4c2014-04-30 18:11:11 +0200329 "10" "2"
Roger Meier85fb6de2012-11-02 00:05:42 +0000330do_test "py-py" "json" "buffered-ip" \
331 "py/TestClient.py --proto=json --port=9090 --host=localhost --genpydir=py/gen-py" \
332 "py/TestServer.py --proto=json --port=9090 --genpydir=py/gen-py TSimpleServer" \
henriqued5aba4c2014-04-30 18:11:11 +0200333 "10" "2"
Roger Meier85fb6de2012-11-02 00:05:42 +0000334do_test "py-cpp" "binary" "buffered-ip" \
335 "py/TestClient.py --proto=binary --port=9090 --host=localhost --genpydir=py/gen-py" \
336 "cpp/TestServer" \
henriqued5aba4c2014-04-30 18:11:11 +0200337 "10" "2"
Roger Meier85fb6de2012-11-02 00:05:42 +0000338do_test "py-cpp" "json" "buffered-ip" \
339 "py/TestClient.py --proto=json --port=9090 --host=localhost --genpydir=py/gen-py" \
340 "cpp/TestServer --protocol=json" \
henriqued5aba4c2014-04-30 18:11:11 +0200341 "10" "2"
Roger Meier85fb6de2012-11-02 00:05:42 +0000342do_test "cpp-py" "binary" "buffered-ip" \
343 "cpp/TestClient --protocol=binary --port=9090" \
344 "py/TestServer.py --proto=binary --port=9090 --genpydir=py/gen-py TSimpleServer" \
henriqued5aba4c2014-04-30 18:11:11 +0200345 "10" "2"
Roger Meier85fb6de2012-11-02 00:05:42 +0000346do_test "cpp-py" "json" "buffered-ip" \
347 "cpp/TestClient --protocol=json --port=9090" \
348 "py/TestServer.py --proto=json --port=9090 --genpydir=py/gen-py TSimpleServer" \
henriqued5aba4c2014-04-30 18:11:11 +0200349 "10" "2"
Roger Meier85fb6de2012-11-02 00:05:42 +0000350do_test "py-java" "binary" "buffered-ip" \
351 "py/TestClient.py --proto=binary --port=9090 --host=localhost --genpydir=py/gen-py" \
henriqued17f1c92014-04-30 16:21:25 +0200352 "ant -f ../lib/java/build.xml -Dno-gen-thrift=\"\" run-testserver" \
henriqued5aba4c2014-04-30 18:11:11 +0200353 "15" "2"
Roger Meier7a66f752014-03-10 12:35:41 +0100354do_test "py-java" "json" "buffered-ip" \
Roger Meier85fb6de2012-11-02 00:05:42 +0000355 "py/TestClient.py --proto=json --port=9090 --host=localhost --genpydir=py/gen-py" \
henriqued17f1c92014-04-30 16:21:25 +0200356 "ant -f ../lib/java/build.xml -Dno-gen-thrift=\"\" -Dtestargs \"--protocol=json\" run-testserver" \
henriqued5aba4c2014-04-30 18:11:11 +0200357 "15" "2"
Roger Meier85fb6de2012-11-02 00:05:42 +0000358do_test "java-py" "binary" "buffered-ip" \
henriqued17f1c92014-04-30 16:21:25 +0200359 "ant -f ../lib/java/build.xml -Dno-gen-thrift=\"\" run-testclient" \
Roger Meier85fb6de2012-11-02 00:05:42 +0000360 "py/TestServer.py --proto=binary --port=9090 --genpydir=py/gen-py TSimpleServer" \
henriqued17f1c92014-04-30 16:21:25 +0200361 "10" "5"
Roger Meier4edac7f2014-05-02 21:07:01 +0200362do_test "js-java" "json" "http-ip" \
Roger Meier4d5157d2012-01-09 21:23:19 +0000363 "" \
364 "ant -f ../lib/js/test/build.xml unittest" \
henriqued17f1c92014-04-30 16:21:25 +0200365 "2" "2"
Roger Meier4d5157d2012-01-09 21:23:19 +0000366do_test "perl-cpp" "binary" "buffered-ip" \
Roger Meier01b568c2012-01-10 21:30:02 +0000367 "perl -I perl/gen-perl/ -I../lib/perl/lib/ perl/TestClient.pl" \
Roger Meier4d5157d2012-01-09 21:23:19 +0000368 "cpp/TestServer" \
henriqued5aba4c2014-04-30 18:11:11 +0200369 "10" "2"
Roger Meierb33967b2012-01-21 09:18:05 +0000370do_test "php-cpp" "binary" "buffered-ip" \
371 "make -C php/ client" \
372 "cpp/TestServer" \
henriqued5aba4c2014-04-30 18:11:11 +0200373 "10" "2"
Roger Meierc95d5df2014-01-19 21:53:02 +0100374do_test "rb-rb" "binary" "buffered-ip" \
375 "ruby rb/integration/simple_client.rb" \
376 "ruby rb/integration/simple_server.rb" \
henriqued17f1c92014-04-30 16:21:25 +0200377 "5" "5"
Roger Meier9aa08a92014-01-20 18:41:48 +0100378do_test "rb-rb" "binary-accl" "buffered-ip" \
Roger Meierc95d5df2014-01-19 21:53:02 +0100379 "ruby rb/integration/accelerated_buffered_client.rb" \
380 "ruby rb/integration/accelerated_buffered_server.rb" \
henriqued17f1c92014-04-30 16:21:25 +0200381 "5" "5"
Roger Meier4edac7f2014-05-02 21:07:01 +0200382
383echo " failed tests are logged to test/log/error.log"
Roger Meiercc0fe272014-05-16 23:18:25 +0200384echo " full log is here test/log/client_server_protocol_transport_client.log"
385echo " full log is here test/log/client_server_protocol_transport_server.log"
386echo " or look at file://$BASEDIR/$STATUS_HTML"
387
388ELAPSED_TIME=$(($SECONDS - $START_TIME))
389DURATION="$(($ELAPSED_TIME/60)) min $(($ELAPSED_TIME%60)) sec"
390echo "test an took" $DURATION
391print_html_footer "$DURATION"
392
Roger Meier4edac7f2014-05-02 21:07:01 +0200393date
Roger Meier82525772012-11-16 00:38:27 +0000394cd -