blob: 1ab4d216d3c435d585bf9180ed9b92afbf097bf1 [file] [log] [blame]
David Reissea2cba82009-03-30 21:35:00 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
Roger Meierd3b9dca2011-06-24 14:01:10 +000020#define __STDC_FORMAT_MACROS
21#include <inttypes.h>
22
Roger Meierca142b02011-06-07 17:59:07 +000023#include <iostream>
Roger Meier49ff8b12012-04-13 09:12:31 +000024#include <thrift/protocol/TBinaryProtocol.h>
Roger Meier023192f2014-02-12 09:35:12 +010025#include <thrift/protocol/TCompactProtocol.h>
Roger Meier49ff8b12012-04-13 09:12:31 +000026#include <thrift/protocol/TJSONProtocol.h>
27#include <thrift/transport/THttpClient.h>
28#include <thrift/transport/TTransportUtils.h>
29#include <thrift/transport/TSocket.h>
30#include <thrift/transport/TSSLSocket.h>
31#include <thrift/async/TEvhttpClientChannel.h>
32#include <thrift/server/TNonblockingServer.h> // <event.h>
Mark Sleee8540632006-05-30 09:24:40 +000033
Marc Slemko6be374b2006-08-04 03:16:25 +000034#include <boost/shared_ptr.hpp>
Roger Meierca142b02011-06-07 17:59:07 +000035#include <boost/program_options.hpp>
cdwijayarathnaa07ec0b2014-08-09 17:45:56 +053036#include <boost/filesystem.hpp>
Jake Farrell5d02b802014-01-07 21:42:01 -050037#include <thrift/cxxfunctional.h>
38#if _WIN32
Konrad Grochowski16a23a62014-11-13 15:33:38 +010039#include <thrift/windows/TWinsockSingleton.h>
Jake Farrell5d02b802014-01-07 21:42:01 -050040#endif
Roger Meierca142b02011-06-07 17:59:07 +000041
Marc Slemko6be374b2006-08-04 03:16:25 +000042#include "ThriftTest.h"
43
Marc Slemko6be374b2006-08-04 03:16:25 +000044using namespace std;
T Jake Lucianib5e62212009-01-31 22:36:20 +000045using namespace apache::thrift;
46using namespace apache::thrift::protocol;
47using namespace apache::thrift::transport;
Marc Slemkobf4fd192006-08-15 21:29:39 +000048using namespace thrift::test;
Roger Meier7e056e72011-07-17 07:28:28 +000049using namespace apache::thrift::async;
50
cdwijayarathnaa07ec0b2014-08-09 17:45:56 +053051// Length of argv[0] - Length of script dir
52#define EXECUTABLE_FILE_NAME_LENGTH 19
53
Mark Slee95771002006-06-07 06:53:25 +000054// Current time, microseconds since the epoch
Konrad Grochowski16a23a62014-11-13 15:33:38 +010055uint64_t now() {
Roger Meier5f9614c2010-11-21 16:59:05 +000056 int64_t ret;
Mark Slee95771002006-06-07 06:53:25 +000057 struct timeval tv;
David Reiss0c90f6f2008-02-06 22:18:40 +000058
Jake Farrell5d02b802014-01-07 21:42:01 -050059 THRIFT_GETTIMEOFDAY(&tv, NULL);
Mark Slee95771002006-06-07 06:53:25 +000060 ret = tv.tv_sec;
Konrad Grochowski16a23a62014-11-13 15:33:38 +010061 ret = ret * 1000 * 1000 + tv.tv_usec;
Mark Slee95771002006-06-07 06:53:25 +000062 return ret;
63}
64
Konrad Grochowski16a23a62014-11-13 15:33:38 +010065static void testString_clientReturn(const char* host,
66 int port,
67 event_base* base,
68 TProtocolFactory* protocolFactory,
69 ThriftTestCobClient* client) {
70 (void)host;
71 (void)port;
72 (void)protocolFactory;
Roger Meier7e056e72011-07-17 07:28:28 +000073 try {
74 string s;
75 client->recv_testString(s);
76 cout << "testString: " << s << endl;
77 } catch (TException& exn) {
Jake Farrell5d02b802014-01-07 21:42:01 -050078 cout << "Error: " << exn.what() << endl;
Roger Meier7e056e72011-07-17 07:28:28 +000079 }
80
81 event_base_loopbreak(base); // end test
82}
83
Konrad Grochowski16a23a62014-11-13 15:33:38 +010084static void testVoid_clientReturn(const char* host,
85 int port,
86 event_base* base,
87 TProtocolFactory* protocolFactory,
88 ThriftTestCobClient* client) {
Roger Meier7e056e72011-07-17 07:28:28 +000089 try {
90 client->recv_testVoid();
91 cout << "testVoid" << endl;
92
93 // next test
94 delete client;
Roger Meier611f90c2011-12-11 22:08:51 +000095 boost::shared_ptr<TAsyncChannel> channel(new TEvhttpClientChannel(host, "/", host, port, base));
Roger Meier7e056e72011-07-17 07:28:28 +000096 client = new ThriftTestCobClient(channel, protocolFactory);
Konrad Grochowski16a23a62014-11-13 15:33:38 +010097 client->testString(tcxx::bind(testString_clientReturn,
98 host,
99 port,
100 base,
101 protocolFactory,
102 tcxx::placeholders::_1),
103 "Test");
Roger Meier7e056e72011-07-17 07:28:28 +0000104 } catch (TException& exn) {
Jake Farrell5d02b802014-01-07 21:42:01 -0500105 cout << "Error: " << exn.what() << endl;
Roger Meier7e056e72011-07-17 07:28:28 +0000106 }
107}
108
Mark Sleee8540632006-05-30 09:24:40 +0000109int main(int argc, char** argv) {
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900110 int ERR_BASETYPES = 1;
111 int ERR_STRUCTS = 2;
112 int ERR_CONTAINERS = 4;
113 int ERR_EXCEPTIONS = 8;
114 int ERR_UNKNOWN = 64;
115
cdwijayarathnaa07ec0b2014-08-09 17:45:56 +0530116 string file_path = boost::filesystem::system_complete(argv[0]).string();
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100117 string dir_path = file_path.substr(0, file_path.size() - EXECUTABLE_FILE_NAME_LENGTH);
Jake Farrell5d02b802014-01-07 21:42:01 -0500118#if _WIN32
119 transport::TWinsockSingleton::create();
120#endif
Mark Sleee8540632006-05-30 09:24:40 +0000121 string host = "localhost";
122 int port = 9090;
123 int numTests = 1;
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000124 bool ssl = false;
Roger Meierca142b02011-06-07 17:59:07 +0000125 string transport_type = "buffered";
126 string protocol_type = "binary";
127 string domain_socket = "";
pavlodd08f6e2015-10-08 16:43:56 -0400128 bool abstract_namespace = false;
Jens Geyerf4598682014-05-08 23:18:44 +0200129 bool noinsane = false;
Mark Sleee8540632006-05-30 09:24:40 +0000130
Jake Farrell5d02b802014-01-07 21:42:01 -0500131 boost::program_options::options_description desc("Allowed options");
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100132 desc.add_options()("help,h",
133 "produce help message")("host",
134 boost::program_options::value<string>(&host)
135 ->default_value(host),
136 "Host to connect")("port",
137 boost::program_options::value<int>(
138 &port)->default_value(port),
139 "Port number to connect")(
140 "domain-socket",
141 boost::program_options::value<string>(&domain_socket)->default_value(domain_socket),
142 "Domain Socket (e.g. /tmp/ThriftTest.thrift), instead of host and port")(
pavlodd08f6e2015-10-08 16:43:56 -0400143 "abstract-namespace",
144 "Look for the domain socket in the Abstract Namespace (no connection with filesystem pathnames)")(
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100145 "transport",
146 boost::program_options::value<string>(&transport_type)->default_value(transport_type),
147 "Transport: buffered, framed, http, evhttp")(
148 "protocol",
149 boost::program_options::value<string>(&protocol_type)->default_value(protocol_type),
150 "Protocol: binary, compact, json")("ssl", "Encrypted Transport using SSL")(
151 "testloops,n",
152 boost::program_options::value<int>(&numTests)->default_value(numTests),
153 "Number of Tests")("noinsane", "Do not run insanity test");
Roger Meierca142b02011-06-07 17:59:07 +0000154
Jake Farrell5d02b802014-01-07 21:42:01 -0500155 boost::program_options::variables_map vm;
156 boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm);
157 boost::program_options::notify(vm);
Roger Meierca142b02011-06-07 17:59:07 +0000158
159 if (vm.count("help")) {
160 cout << desc << "\n";
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900161 return ERR_UNKNOWN;
Mark Sleee8540632006-05-30 09:24:40 +0000162 }
Mark Sleea3302652006-10-25 19:03:32 +0000163
Jake Farrell5d02b802014-01-07 21:42:01 -0500164 try {
Roger Meierca142b02011-06-07 17:59:07 +0000165 if (!protocol_type.empty()) {
166 if (protocol_type == "binary") {
Roger Meier284101c2014-03-11 21:20:35 +0100167 } else if (protocol_type == "compact") {
Roger Meierca142b02011-06-07 17:59:07 +0000168 } else if (protocol_type == "json") {
169 } else {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100170 throw invalid_argument("Unknown protocol type " + protocol_type);
Roger Meierca142b02011-06-07 17:59:07 +0000171 }
172 }
173
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100174 if (!transport_type.empty()) {
Roger Meierca142b02011-06-07 17:59:07 +0000175 if (transport_type == "buffered") {
176 } else if (transport_type == "framed") {
177 } else if (transport_type == "http") {
Roger Meier7e056e72011-07-17 07:28:28 +0000178 } else if (transport_type == "evhttp") {
Roger Meierca142b02011-06-07 17:59:07 +0000179 } else {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100180 throw invalid_argument("Unknown transport type " + transport_type);
Roger Meierca142b02011-06-07 17:59:07 +0000181 }
182 }
183
184 } catch (std::exception& e) {
185 cerr << e.what() << endl;
186 cout << desc << "\n";
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900187 return ERR_UNKNOWN;
Roger Meierca142b02011-06-07 17:59:07 +0000188 }
189
190 if (vm.count("ssl")) {
191 ssl = true;
192 }
cdwijayarathnaa07ec0b2014-08-09 17:45:56 +0530193
pavlodd08f6e2015-10-08 16:43:56 -0400194 if (vm.count("abstract-namespace")) {
195 abstract_namespace = true;
196 }
197
Jens Geyerf4598682014-05-08 23:18:44 +0200198 if (vm.count("noinsane")) {
199 noinsane = true;
200 }
Roger Meierca142b02011-06-07 17:59:07 +0000201
Roger Meier611f90c2011-12-11 22:08:51 +0000202 boost::shared_ptr<TTransport> transport;
203 boost::shared_ptr<TProtocol> protocol;
Roger Meierca142b02011-06-07 17:59:07 +0000204
Roger Meier611f90c2011-12-11 22:08:51 +0000205 boost::shared_ptr<TSocket> socket;
206 boost::shared_ptr<TSSLSocketFactory> factory;
Roger Meierca142b02011-06-07 17:59:07 +0000207
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000208 if (ssl) {
Roger Meier611f90c2011-12-11 22:08:51 +0000209 factory = boost::shared_ptr<TSSLSocketFactory>(new TSSLSocketFactory());
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000210 factory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
cdwijayarathnaa07ec0b2014-08-09 17:45:56 +0530211 factory->loadTrustedCertificates((dir_path + "../keys/CA.pem").c_str());
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000212 factory->authenticate(true);
213 socket = factory->createSocket(host, port);
214 } else {
Roger Meierca142b02011-06-07 17:59:07 +0000215 if (domain_socket != "") {
pavlodd08f6e2015-10-08 16:43:56 -0400216 if (abstract_namespace) {
217 std::string abstract_socket("\0", 1);
218 abstract_socket += domain_socket;
219 socket = boost::shared_ptr<TSocket>(new TSocket(abstract_socket));
220 } else {
221 socket = boost::shared_ptr<TSocket>(new TSocket(domain_socket));
222 }
Roger Meierca142b02011-06-07 17:59:07 +0000223 port = 0;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100224 } else {
Roger Meier611f90c2011-12-11 22:08:51 +0000225 socket = boost::shared_ptr<TSocket>(new TSocket(host, port));
Roger Meierca142b02011-06-07 17:59:07 +0000226 }
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000227 }
Mark Sleea3302652006-10-25 19:03:32 +0000228
Roger Meierca142b02011-06-07 17:59:07 +0000229 if (transport_type.compare("http") == 0) {
Roger Meier611f90c2011-12-11 22:08:51 +0000230 boost::shared_ptr<TTransport> httpSocket(new THttpClient(socket, host, "/service"));
Roger Meierca142b02011-06-07 17:59:07 +0000231 transport = httpSocket;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100232 } else if (transport_type.compare("framed") == 0) {
Roger Meier611f90c2011-12-11 22:08:51 +0000233 boost::shared_ptr<TFramedTransport> framedSocket(new TFramedTransport(socket));
Mark Sleea3302652006-10-25 19:03:32 +0000234 transport = framedSocket;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100235 } else {
Roger Meier611f90c2011-12-11 22:08:51 +0000236 boost::shared_ptr<TBufferedTransport> bufferedSocket(new TBufferedTransport(socket));
Mark Sleea3302652006-10-25 19:03:32 +0000237 transport = bufferedSocket;
238 }
239
Roger Meierca142b02011-06-07 17:59:07 +0000240 if (protocol_type.compare("json") == 0) {
Roger Meier611f90c2011-12-11 22:08:51 +0000241 boost::shared_ptr<TProtocol> jsonProtocol(new TJSONProtocol(transport));
Roger Meierca142b02011-06-07 17:59:07 +0000242 protocol = jsonProtocol;
Roger Meier023192f2014-02-12 09:35:12 +0100243 } else if (protocol_type.compare("compact") == 0) {
244 boost::shared_ptr<TProtocol> compactProtocol(new TCompactProtocol(transport));
245 protocol = compactProtocol;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100246 } else {
Roger Meier611f90c2011-12-11 22:08:51 +0000247 boost::shared_ptr<TBinaryProtocol> binaryProtocol(new TBinaryProtocol(transport));
Roger Meierca142b02011-06-07 17:59:07 +0000248 protocol = binaryProtocol;
249 }
250
251 // Connection info
pavlodd08f6e2015-10-08 16:43:56 -0400252 cout << "Connecting (" << transport_type << "/" << protocol_type << ") to: ";
253 if (abstract_namespace) {
254 cout << '@';
255 }
256 cout << domain_socket;
Roger Meierca142b02011-06-07 17:59:07 +0000257 if (port != 0) {
258 cout << host << ":" << port;
259 }
260 cout << endl;
261
Roger Meier7e056e72011-07-17 07:28:28 +0000262 if (transport_type.compare("evhttp") == 0) {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100263 event_base* base = event_base_new();
Roger Meier7e056e72011-07-17 07:28:28 +0000264 cout << "Libevent Version: " << event_get_version() << endl;
265 cout << "Libevent Method: " << event_base_get_method(base) << endl;
266#if LIBEVENT_VERSION_NUMBER >= 0x02000000
267 cout << "Libevent Features: 0x" << hex << event_base_get_features(base) << endl;
268#endif
269
Roger Meier611f90c2011-12-11 22:08:51 +0000270 boost::shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
Roger Meier7e056e72011-07-17 07:28:28 +0000271
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100272 boost::shared_ptr<TAsyncChannel> channel(
273 new TEvhttpClientChannel(host.c_str(), "/", host.c_str(), port, base));
Roger Meier7e056e72011-07-17 07:28:28 +0000274 ThriftTestCobClient* client = new ThriftTestCobClient(channel, protocolFactory.get());
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100275 client->testVoid(tcxx::bind(testVoid_clientReturn,
276 host.c_str(),
277 port,
278 base,
279 protocolFactory.get(),
280 tcxx::placeholders::_1));
Jake Farrell5d02b802014-01-07 21:42:01 -0500281
Roger Meier7e056e72011-07-17 07:28:28 +0000282 event_base_loop(base, 0);
283 return 0;
284 }
285
Roger Meierca142b02011-06-07 17:59:07 +0000286 ThriftTestClient testClient(protocol);
Mark Sleed788b2e2006-09-07 01:26:35 +0000287
288 uint64_t time_min = 0;
289 uint64_t time_max = 0;
290 uint64_t time_tot = 0;
David Reiss0c90f6f2008-02-06 22:18:40 +0000291
Jens Geyerd629ea02015-09-23 21:16:50 +0200292 int return_code = 0;
Jens Geyerd629ea02015-09-23 21:16:50 +0200293
Mark Sleee8540632006-05-30 09:24:40 +0000294 int test = 0;
295 for (test = 0; test < numTests; ++test) {
Mark Slee95771002006-06-07 06:53:25 +0000296
Mark Slee95771002006-06-07 06:53:25 +0000297 try {
Mark Sleea3302652006-10-25 19:03:32 +0000298 transport->open();
Mark Slee95771002006-06-07 06:53:25 +0000299 } catch (TTransportException& ttx) {
Mark Sleeb9ff32a2006-11-16 01:00:24 +0000300 printf("Connect failed: %s\n", ttx.what());
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900301 return ERR_UNKNOWN;
Mark Sleee8540632006-05-30 09:24:40 +0000302 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000303
Mark Sleed788b2e2006-09-07 01:26:35 +0000304 /**
305 * CONNECT TEST
306 */
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100307 printf("Test #%d, connect %s:%d\n", test + 1, host.c_str(), port);
Mark Slee95771002006-06-07 06:53:25 +0000308
309 uint64_t start = now();
David Reiss0c90f6f2008-02-06 22:18:40 +0000310
Mark Sleee8540632006-05-30 09:24:40 +0000311 /**
312 * VOID TEST
313 */
Mark Sleee129a2d2007-02-21 05:17:48 +0000314 try {
315 printf("testVoid()");
316 testClient.testVoid();
317 printf(" = void\n");
Roger Meier4fce9602012-05-04 06:22:09 +0000318 } catch (TApplicationException& tax) {
Jens Geyerd629ea02015-09-23 21:16:50 +0200319 printf("*** FAILED ***\n");
Mark Sleee129a2d2007-02-21 05:17:48 +0000320 printf("%s\n", tax.what());
Jens Geyerd629ea02015-09-23 21:16:50 +0200321 return_code |= ERR_BASETYPES;
Mark Sleee129a2d2007-02-21 05:17:48 +0000322 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000323
Mark Sleee8540632006-05-30 09:24:40 +0000324 /**
325 * STRING TEST
326 */
327 printf("testString(\"Test\")");
Mark Slee1921d202007-01-24 19:43:06 +0000328 string s;
329 testClient.testString(s, "Test");
Mark Sleee8540632006-05-30 09:24:40 +0000330 printf(" = \"%s\"\n", s.c_str());
Jens Geyerd629ea02015-09-23 21:16:50 +0200331 if (s != "Test") {
332 printf("*** FAILED ***\n");
333 return_code |= ERR_BASETYPES;
334 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000335
Mark Sleee8540632006-05-30 09:24:40 +0000336 /**
Nobuaki Sukegawaa649e742015-09-21 13:53:25 +0900337 * BOOL TEST
338 */
339 printf("testBool(true)");
340 bool bl = testClient.testBool(true);
341 printf(" = %s\n", bl ? "true" : "false");
Jens Geyerd629ea02015-09-23 21:16:50 +0200342 if (bl != true) {
343 printf("*** FAILED ***\n");
344 return_code |= ERR_BASETYPES;
345 }
Nobuaki Sukegawaa649e742015-09-21 13:53:25 +0900346
347 printf("testBool(false)");
348 bl = testClient.testBool(false);
349 printf(" = %s\n", bl ? "true" : "false");
Jens Geyerd629ea02015-09-23 21:16:50 +0200350 if (bl != false) {
351 printf("*** FAILED ***\n");
352 return_code |= ERR_BASETYPES;
353 }
Nobuaki Sukegawaa649e742015-09-21 13:53:25 +0900354
355 /**
Mark Sleee8540632006-05-30 09:24:40 +0000356 * BYTE TEST
357 */
358 printf("testByte(1)");
359 uint8_t u8 = testClient.testByte(1);
360 printf(" = %d\n", (int)u8);
Jens Geyerd629ea02015-09-23 21:16:50 +0200361 if (u8 != 1) {
362 printf("*** FAILED ***\n");
363 return_code |= ERR_BASETYPES;
364 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000365
Mark Sleee8540632006-05-30 09:24:40 +0000366 /**
367 * I32 TEST
368 */
369 printf("testI32(-1)");
370 int32_t i32 = testClient.testI32(-1);
371 printf(" = %d\n", i32);
Jens Geyerd629ea02015-09-23 21:16:50 +0200372 if (i32 != -1) {
373 printf("*** FAILED ***\n");
374 return_code |= ERR_BASETYPES;
375 }
Mark Sleee8540632006-05-30 09:24:40 +0000376
377 /**
Mark Sleee8540632006-05-30 09:24:40 +0000378 * I64 TEST
379 */
380 printf("testI64(-34359738368)");
Marc Slemkobf4fd192006-08-15 21:29:39 +0000381 int64_t i64 = testClient.testI64(-34359738368LL);
Roger Meier0e814802014-01-17 21:07:58 +0100382 printf(" = %" PRId64 "\n", i64);
Jens Geyerd629ea02015-09-23 21:16:50 +0200383 if (i64 != -34359738368LL) {
384 printf("*** FAILED ***\n");
385 return_code |= ERR_BASETYPES;
386 }
Jens Geyer8bcfdd92014-12-14 03:14:26 +0100387
Mark Sleec98d0502006-09-06 02:42:25 +0000388 /**
389 * DOUBLE TEST
390 */
391 printf("testDouble(-5.2098523)");
392 double dub = testClient.testDouble(-5.2098523);
Roger Meiera8cef6e2011-07-17 18:55:59 +0000393 printf(" = %f\n", dub);
Jens Geyerd629ea02015-09-23 21:16:50 +0200394 if ((dub - (-5.2098523)) > 0.001) {
395 printf("*** FAILED ***\n");
396 return_code |= ERR_BASETYPES;
397 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000398
Mark Sleee8540632006-05-30 09:24:40 +0000399 /**
Jens Geyer8bcfdd92014-12-14 03:14:26 +0100400 * BINARY TEST
401 */
Jens Geyerd629ea02015-09-23 21:16:50 +0200402 printf("testBinary([-128..127]) = {");
403 const char bin_data[256]
404 = {-128, -127, -126, -125, -124, -123, -122, -121, -120, -119, -118, -117, -116, -115, -114,
405 -113, -112, -111, -110, -109, -108, -107, -106, -105, -104, -103, -102, -101, -100, -99,
406 -98, -97, -96, -95, -94, -93, -92, -91, -90, -89, -88, -87, -86, -85, -84,
407 -83, -82, -81, -80, -79, -78, -77, -76, -75, -74, -73, -72, -71, -70, -69,
408 -68, -67, -66, -65, -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54,
409 -53, -52, -51, -50, -49, -48, -47, -46, -45, -44, -43, -42, -41, -40, -39,
410 -38, -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, -26, -25, -24,
411 -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9,
412 -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6,
413 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
414 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
415 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
416 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
417 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
418 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
419 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
420 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
421 127};
422 try {
423 string bin_result;
424 testClient.testBinary(bin_result, string(bin_data, 256));
425 if (bin_result.size() != 256) {
426 printf("}\n*** FAILED ***\n");
427 printf("invalid length: %lu\n", bin_result.size());
428 return_code |= ERR_BASETYPES;
429 } else {
430 bool first = true;
431 bool failed = false;
432 for (int i = 0; i < 256; ++i) {
433 if (!first)
434 printf(" ,");
435 else
436 first = false;
437 printf("%d", bin_result[i]);
438 if (!failed && bin_result[i] != i - 128) {
439 failed = true;
440 }
441 }
442 printf("}\n");
443 if (failed) {
444 printf("*** FAILED ***\n");
445 return_code |= ERR_BASETYPES;
446 }
447 }
448 } catch (exception& ex) {
449 printf("}\n*** FAILED ***\n");
450 printf("%s\n", ex.what());
451 return_code |= ERR_BASETYPES;
452 }
453
Jens Geyer8bcfdd92014-12-14 03:14:26 +0100454
455 /**
Mark Sleee8540632006-05-30 09:24:40 +0000456 * STRUCT TEST
457 */
Mark Slee6e536442006-06-30 18:28:50 +0000458 printf("testStruct({\"Zero\", 1, -3, -5})");
Mark Sleee8540632006-05-30 09:24:40 +0000459 Xtruct out;
460 out.string_thing = "Zero";
461 out.byte_thing = 1;
Mark Sleee8540632006-05-30 09:24:40 +0000462 out.i32_thing = -3;
Mark Sleee8540632006-05-30 09:24:40 +0000463 out.i64_thing = -5;
Mark Slee1921d202007-01-24 19:43:06 +0000464 Xtruct in;
465 testClient.testStruct(in, out);
Roger Meier0e814802014-01-17 21:07:58 +0100466 printf(" = {\"%s\", %d, %d, %" PRId64 "}\n",
Mark Sleee8540632006-05-30 09:24:40 +0000467 in.string_thing.c_str(),
468 (int)in.byte_thing,
Mark Sleee8540632006-05-30 09:24:40 +0000469 in.i32_thing,
Mark Sleee8540632006-05-30 09:24:40 +0000470 in.i64_thing);
Jens Geyerd629ea02015-09-23 21:16:50 +0200471 if (in != out) {
472 printf("*** FAILED ***\n");
473 return_code |= ERR_STRUCTS;
474 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000475
Mark Sleee8540632006-05-30 09:24:40 +0000476 /**
477 * NESTED STRUCT TEST
478 */
Mark Slee6e536442006-06-30 18:28:50 +0000479 printf("testNest({1, {\"Zero\", 1, -3, -5}), 5}");
Mark Sleee8540632006-05-30 09:24:40 +0000480 Xtruct2 out2;
481 out2.byte_thing = 1;
482 out2.struct_thing = out;
483 out2.i32_thing = 5;
Mark Slee1921d202007-01-24 19:43:06 +0000484 Xtruct2 in2;
485 testClient.testNest(in2, out2);
Mark Sleee8540632006-05-30 09:24:40 +0000486 in = in2.struct_thing;
Roger Meier0e814802014-01-17 21:07:58 +0100487 printf(" = {%d, {\"%s\", %d, %d, %" PRId64 "}, %d}\n",
Mark Sleee8540632006-05-30 09:24:40 +0000488 in2.byte_thing,
489 in.string_thing.c_str(),
490 (int)in.byte_thing,
Mark Sleee8540632006-05-30 09:24:40 +0000491 in.i32_thing,
Mark Sleee8540632006-05-30 09:24:40 +0000492 in.i64_thing,
David Reiss0c90f6f2008-02-06 22:18:40 +0000493 in2.i32_thing);
Jens Geyerd629ea02015-09-23 21:16:50 +0200494 if (in2 != out2) {
495 printf("*** FAILED ***\n");
496 return_code |= ERR_STRUCTS;
497 }
Mark Sleee8540632006-05-30 09:24:40 +0000498
499 /**
500 * MAP TEST
501 */
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100502 map<int32_t, int32_t> mapout;
Mark Sleee8540632006-05-30 09:24:40 +0000503 for (int32_t i = 0; i < 5; ++i) {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100504 mapout.insert(make_pair(i, i - 10));
Mark Sleee8540632006-05-30 09:24:40 +0000505 }
506 printf("testMap({");
507 map<int32_t, int32_t>::const_iterator m_iter;
508 bool first = true;
509 for (m_iter = mapout.begin(); m_iter != mapout.end(); ++m_iter) {
510 if (first) {
511 first = false;
512 } else {
513 printf(", ");
514 }
515 printf("%d => %d", m_iter->first, m_iter->second);
516 }
517 printf("})");
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100518 map<int32_t, int32_t> mapin;
Mark Slee1921d202007-01-24 19:43:06 +0000519 testClient.testMap(mapin, mapout);
Mark Sleee8540632006-05-30 09:24:40 +0000520 printf(" = {");
521 first = true;
522 for (m_iter = mapin.begin(); m_iter != mapin.end(); ++m_iter) {
523 if (first) {
524 first = false;
525 } else {
526 printf(", ");
527 }
528 printf("%d => %d", m_iter->first, m_iter->second);
529 }
530 printf("}\n");
Jens Geyerd629ea02015-09-23 21:16:50 +0200531 if (mapin != mapout) {
532 printf("*** FAILED ***\n");
533 return_code |= ERR_CONTAINERS;
534 }
Roger Meier4fce9602012-05-04 06:22:09 +0000535
536 /**
537 * STRING MAP TEST
Roger Meier4fce9602012-05-04 06:22:09 +0000538 */
Jens Geyerd629ea02015-09-23 21:16:50 +0200539 printf("testStringMap({a => 2, b => blah, some => thing}) = {");
540 map<string, string> smapin;
541 map<string, string> smapout;
542 smapin["a"] = "2";
543 smapin["b"] = "blah";
544 smapin["some"] = "thing";
545 try {
546 testClient.testStringMap(smapout, smapin);
547 first = true;
548 for (map<string, string>::const_iterator it = smapout.begin(); it != smapout.end(); ++it) {
549 if (first)
550 printf(",");
551 else
552 first = false;
553 printf("%s => %s", it->first.c_str(), it->second.c_str());
554 }
555 printf("}\n");
556 if (smapin != smapout) {
557 printf("*** FAILED ***\n");
558 return_code |= ERR_CONTAINERS;
559 }
560 } catch (exception& ex) {
561 printf("}\n*** FAILED ***\n");
562 printf("%s\n", ex.what());
563 return_code |= ERR_CONTAINERS;
564 }
Mark Sleee8540632006-05-30 09:24:40 +0000565
566 /**
567 * SET TEST
568 */
569 set<int32_t> setout;
570 for (int32_t i = -2; i < 3; ++i) {
571 setout.insert(i);
572 }
573 printf("testSet({");
574 set<int32_t>::const_iterator s_iter;
575 first = true;
576 for (s_iter = setout.begin(); s_iter != setout.end(); ++s_iter) {
577 if (first) {
578 first = false;
579 } else {
580 printf(", ");
581 }
582 printf("%d", *s_iter);
583 }
584 printf("})");
Mark Slee1921d202007-01-24 19:43:06 +0000585 set<int32_t> setin;
586 testClient.testSet(setin, setout);
Mark Sleee8540632006-05-30 09:24:40 +0000587 printf(" = {");
588 first = true;
589 for (s_iter = setin.begin(); s_iter != setin.end(); ++s_iter) {
590 if (first) {
591 first = false;
592 } else {
593 printf(", ");
594 }
595 printf("%d", *s_iter);
596 }
597 printf("}\n");
Jens Geyerd629ea02015-09-23 21:16:50 +0200598 if (setin != setout) {
599 printf("*** FAILED ***\n");
600 return_code |= ERR_CONTAINERS;
601 }
Mark Sleee8540632006-05-30 09:24:40 +0000602
603 /**
604 * LIST TEST
605 */
Mark Sleeb9acf982006-10-10 01:57:32 +0000606 vector<int32_t> listout;
Mark Sleee8540632006-05-30 09:24:40 +0000607 for (int32_t i = -2; i < 3; ++i) {
608 listout.push_back(i);
609 }
610 printf("testList({");
Mark Sleeb9acf982006-10-10 01:57:32 +0000611 vector<int32_t>::const_iterator l_iter;
Mark Sleee8540632006-05-30 09:24:40 +0000612 first = true;
613 for (l_iter = listout.begin(); l_iter != listout.end(); ++l_iter) {
614 if (first) {
615 first = false;
616 } else {
617 printf(", ");
618 }
619 printf("%d", *l_iter);
620 }
621 printf("})");
Mark Slee1921d202007-01-24 19:43:06 +0000622 vector<int32_t> listin;
623 testClient.testList(listin, listout);
Mark Sleee8540632006-05-30 09:24:40 +0000624 printf(" = {");
625 first = true;
626 for (l_iter = listin.begin(); l_iter != listin.end(); ++l_iter) {
627 if (first) {
628 first = false;
629 } else {
630 printf(", ");
631 }
632 printf("%d", *l_iter);
633 }
634 printf("}\n");
Jens Geyerd629ea02015-09-23 21:16:50 +0200635 if (listin != listout) {
636 printf("*** FAILED ***\n");
637 return_code |= ERR_CONTAINERS;
638 }
Mark Sleee8540632006-05-30 09:24:40 +0000639
640 /**
641 * ENUM TEST
642 */
643 printf("testEnum(ONE)");
Bryan Duxbury833ae492010-09-27 17:26:02 +0000644 Numberz::type ret = testClient.testEnum(Numberz::ONE);
Mark Sleee8540632006-05-30 09:24:40 +0000645 printf(" = %d\n", ret);
Jens Geyerd629ea02015-09-23 21:16:50 +0200646 if (ret != Numberz::ONE) {
647 printf("*** FAILED ***\n");
648 return_code |= ERR_STRUCTS;
649 }
Mark Sleee8540632006-05-30 09:24:40 +0000650
651 printf("testEnum(TWO)");
Bryan Duxbury833ae492010-09-27 17:26:02 +0000652 ret = testClient.testEnum(Numberz::TWO);
Mark Sleee8540632006-05-30 09:24:40 +0000653 printf(" = %d\n", ret);
Jens Geyerd629ea02015-09-23 21:16:50 +0200654 if (ret != Numberz::TWO) {
655 printf("*** FAILED ***\n");
656 return_code |= ERR_STRUCTS;
657 }
Mark Sleee8540632006-05-30 09:24:40 +0000658
659 printf("testEnum(THREE)");
Bryan Duxbury833ae492010-09-27 17:26:02 +0000660 ret = testClient.testEnum(Numberz::THREE);
Mark Sleee8540632006-05-30 09:24:40 +0000661 printf(" = %d\n", ret);
Jens Geyerd629ea02015-09-23 21:16:50 +0200662 if (ret != Numberz::THREE) {
663 printf("*** FAILED ***\n");
664 return_code |= ERR_STRUCTS;
665 }
Mark Sleee8540632006-05-30 09:24:40 +0000666
667 printf("testEnum(FIVE)");
Bryan Duxbury833ae492010-09-27 17:26:02 +0000668 ret = testClient.testEnum(Numberz::FIVE);
Mark Sleee8540632006-05-30 09:24:40 +0000669 printf(" = %d\n", ret);
Jens Geyerd629ea02015-09-23 21:16:50 +0200670 if (ret != Numberz::FIVE) {
671 printf("*** FAILED ***\n");
672 return_code |= ERR_STRUCTS;
673 }
Mark Sleee8540632006-05-30 09:24:40 +0000674
675 printf("testEnum(EIGHT)");
Bryan Duxbury833ae492010-09-27 17:26:02 +0000676 ret = testClient.testEnum(Numberz::EIGHT);
Mark Sleee8540632006-05-30 09:24:40 +0000677 printf(" = %d\n", ret);
Jens Geyerd629ea02015-09-23 21:16:50 +0200678 if (ret != Numberz::EIGHT) {
679 printf("*** FAILED ***\n");
680 return_code |= ERR_STRUCTS;
681 }
Mark Sleee8540632006-05-30 09:24:40 +0000682
683 /**
684 * TYPEDEF TEST
685 */
686 printf("testTypedef(309858235082523)");
Marc Slemkobf4fd192006-08-15 21:29:39 +0000687 UserId uid = testClient.testTypedef(309858235082523LL);
Roger Meier0e814802014-01-17 21:07:58 +0100688 printf(" = %" PRId64 "\n", uid);
Jens Geyerd629ea02015-09-23 21:16:50 +0200689 if (uid != 309858235082523LL) {
690 printf("*** FAILED ***\n");
691 return_code |= ERR_STRUCTS;
692 }
Mark Sleee8540632006-05-30 09:24:40 +0000693
694 /**
695 * NESTED MAP TEST
696 */
697 printf("testMapMap(1)");
Mark Slee1921d202007-01-24 19:43:06 +0000698 map<int32_t, map<int32_t, int32_t> > mm;
699 testClient.testMapMap(mm, 1);
Mark Sleee8540632006-05-30 09:24:40 +0000700 printf(" = {");
701 map<int32_t, map<int32_t, int32_t> >::const_iterator mi;
702 for (mi = mm.begin(); mi != mm.end(); ++mi) {
703 printf("%d => {", mi->first);
704 map<int32_t, int32_t>::const_iterator mi2;
705 for (mi2 = mi->second.begin(); mi2 != mi->second.end(); ++mi2) {
706 printf("%d => %d, ", mi2->first, mi2->second);
707 }
708 printf("}, ");
709 }
710 printf("}\n");
Jens Geyerd629ea02015-09-23 21:16:50 +0200711 if (mm.size() != 2 ||
712 mm[-4][-4] != -4 ||
713 mm[-4][-3] != -3 ||
714 mm[-4][-2] != -2 ||
715 mm[-4][-1] != -1 ||
716 mm[4][4] != 4 ||
717 mm[4][3] != 3 ||
718 mm[4][2] != 2 ||
719 mm[4][1] != 1) {
720 printf("*** FAILED ***\n");
721 return_code |= ERR_CONTAINERS;
722 }
Mark Sleee8540632006-05-30 09:24:40 +0000723
724 /**
725 * INSANITY TEST
726 */
Jens Geyerf4598682014-05-08 23:18:44 +0200727 if (!noinsane) {
728 Insanity insane;
Jens Geyerd629ea02015-09-23 21:16:50 +0200729 insane.userMap.insert(make_pair(Numberz::FIVE, 5));
730 insane.userMap.insert(make_pair(Numberz::EIGHT, 8));
Jens Geyerf4598682014-05-08 23:18:44 +0200731 Xtruct truck;
Jens Geyerd629ea02015-09-23 21:16:50 +0200732 truck.string_thing = "Goodbye4";
733 truck.byte_thing = 4;
734 truck.i32_thing = 4;
735 truck.i64_thing = 4;
736 Xtruct truck2;
737 truck2.string_thing = "Hello2";
738 truck2.byte_thing = 2;
739 truck2.i32_thing = 2;
740 truck2.i64_thing = 2;
Jens Geyerf4598682014-05-08 23:18:44 +0200741 insane.xtructs.push_back(truck);
Jens Geyerd629ea02015-09-23 21:16:50 +0200742 insane.xtructs.push_back(truck2);
Jens Geyerf4598682014-05-08 23:18:44 +0200743 printf("testInsanity()");
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100744 map<UserId, map<Numberz::type, Insanity> > whoa;
Jens Geyerf4598682014-05-08 23:18:44 +0200745 testClient.testInsanity(whoa, insane);
746 printf(" = {");
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100747 map<UserId, map<Numberz::type, Insanity> >::const_iterator i_iter;
Jens Geyerf4598682014-05-08 23:18:44 +0200748 for (i_iter = whoa.begin(); i_iter != whoa.end(); ++i_iter) {
749 printf("%" PRId64 " => {", i_iter->first);
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100750 map<Numberz::type, Insanity>::const_iterator i2_iter;
751 for (i2_iter = i_iter->second.begin(); i2_iter != i_iter->second.end(); ++i2_iter) {
Jens Geyerf4598682014-05-08 23:18:44 +0200752 printf("%d => {", i2_iter->first);
753 map<Numberz::type, UserId> userMap = i2_iter->second.userMap;
754 map<Numberz::type, UserId>::const_iterator um;
755 printf("{");
756 for (um = userMap.begin(); um != userMap.end(); ++um) {
757 printf("%d => %" PRId64 ", ", um->first, um->second);
758 }
759 printf("}, ");
Mark Sleee8540632006-05-30 09:24:40 +0000760
Jens Geyerf4598682014-05-08 23:18:44 +0200761 vector<Xtruct> xtructs = i2_iter->second.xtructs;
762 vector<Xtruct>::const_iterator x;
763 printf("{");
764 for (x = xtructs.begin(); x != xtructs.end(); ++x) {
765 printf("{\"%s\", %d, %d, %" PRId64 "}, ",
766 x->string_thing.c_str(),
767 (int)x->byte_thing,
768 x->i32_thing,
769 x->i64_thing);
770 }
771 printf("}");
Mark Sleee8540632006-05-30 09:24:40 +0000772
Jens Geyerf4598682014-05-08 23:18:44 +0200773 printf("}, ");
774 }
Mark Sleee8540632006-05-30 09:24:40 +0000775 printf("}, ");
776 }
Jens Geyerf4598682014-05-08 23:18:44 +0200777 printf("}\n");
Jens Geyerd629ea02015-09-23 21:16:50 +0200778 bool failed = false;
779 map<UserId, map<Numberz::type, Insanity> >::const_iterator it1 = whoa.find(UserId(1));
780 if (whoa.size() != 2) {
781 failed = true;
782 }
783 if (it1 == whoa.end()) {
784 failed = true;
785 } else {
786 map<Numberz::type, Insanity>::const_iterator it12 = it1->second.find(Numberz::TWO);
787 if (it12 == it1->second.end() || it12->second != insane) {
788 failed = true;
789 }
790 map<Numberz::type, Insanity>::const_iterator it13 = it1->second.find(Numberz::THREE);
791 if (it13 == it1->second.end() || it13->second != insane) {
792 failed = true;
793 }
794 }
795 map<UserId, map<Numberz::type, Insanity> >::const_iterator it2 = whoa.find(UserId(2));
796 if (it2 == whoa.end()) {
797 failed = true;
798 } else {
799 map<Numberz::type, Insanity>::const_iterator it26 = it2->second.find(Numberz::SIX);
800 if (it26 == it1->second.end() || it26->second != Insanity()) {
801 failed = true;
802 }
803 }
804 if (failed) {
805 printf("*** FAILED ***\n");
806 return_code |= ERR_STRUCTS;
807 }
Mark Sleee8540632006-05-30 09:24:40 +0000808 }
Jens Geyerd629ea02015-09-23 21:16:50 +0200809
810 /**
811 * MULTI TEST
812 */
813 printf("testMulti()\n");
814 try {
815 map<int16_t, string> mul_map;
816 Xtruct mul_result;
817 mul_map[1] = "blah";
818 mul_map[2] = "thing";
819 testClient.testMulti(mul_result, 42, 4242, 424242, mul_map, Numberz::EIGHT, UserId(24));
820 Xtruct xxs;
821 xxs.string_thing = "Hello2";
822 xxs.byte_thing = 42;
823 xxs.i32_thing = 4242;
824 xxs.i64_thing = 424242;
825 if (mul_result != xxs) {
826 printf("*** FAILED ***\n");
827 return_code |= ERR_STRUCTS;
828 }
829 } catch (exception& ex) {
830 printf("*** FAILED ***\n");
831 return_code |= ERR_STRUCTS;
832 }
833
Marc Slemko71d4e472006-08-15 22:34:04 +0000834 /* test exception */
Mark Slee95771002006-06-07 06:53:25 +0000835
Marc Slemkobf4fd192006-08-15 21:29:39 +0000836 try {
Marc Slemko71d4e472006-08-15 22:34:04 +0000837 printf("testClient.testException(\"Xception\") =>");
838 testClient.testException("Xception");
Jens Geyerd629ea02015-09-23 21:16:50 +0200839 printf(" void\n*** FAILED ***\n");
840 return_code |= ERR_EXCEPTIONS;
David Reiss0c90f6f2008-02-06 22:18:40 +0000841
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100842 } catch (Xception& e) {
Marc Slemko71d4e472006-08-15 22:34:04 +0000843 printf(" {%u, \"%s\"}\n", e.errorCode, e.message.c_str());
Marc Slemkobf4fd192006-08-15 21:29:39 +0000844 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000845
Marc Slemkobf4fd192006-08-15 21:29:39 +0000846 try {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100847 printf("testClient.testException(\"TException\") =>");
848 testClient.testException("TException");
Jens Geyerd629ea02015-09-23 21:16:50 +0200849 printf(" void\n*** FAILED ***\n");
850 return_code |= ERR_EXCEPTIONS;
Roger Meierf50df7f2012-05-02 22:49:55 +0000851
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100852 } catch (const TException&) {
853 printf(" Caught TException\n");
854 }
Roger Meierf50df7f2012-05-02 22:49:55 +0000855
856 try {
Marc Slemko71d4e472006-08-15 22:34:04 +0000857 printf("testClient.testException(\"success\") =>");
858 testClient.testException("success");
859 printf(" void\n");
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100860 } catch (...) {
Jens Geyerd629ea02015-09-23 21:16:50 +0200861 printf(" exception\n*** FAILED ***\n");
862 return_code |= ERR_EXCEPTIONS;
Marc Slemko71d4e472006-08-15 22:34:04 +0000863 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000864
Marc Slemko71d4e472006-08-15 22:34:04 +0000865 /* test multi exception */
David Reiss0c90f6f2008-02-06 22:18:40 +0000866
Marc Slemko71d4e472006-08-15 22:34:04 +0000867 try {
868 printf("testClient.testMultiException(\"Xception\", \"test 1\") =>");
Mark Slee1921d202007-01-24 19:43:06 +0000869 Xtruct result;
870 testClient.testMultiException(result, "Xception", "test 1");
Jens Geyerd629ea02015-09-23 21:16:50 +0200871 printf(" result\n*** FAILED ***\n");
872 return_code |= ERR_EXCEPTIONS;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100873 } catch (Xception& e) {
Marc Slemko71d4e472006-08-15 22:34:04 +0000874 printf(" {%u, \"%s\"}\n", e.errorCode, e.message.c_str());
875 }
876
877 try {
878 printf("testClient.testMultiException(\"Xception2\", \"test 2\") =>");
Mark Slee1921d202007-01-24 19:43:06 +0000879 Xtruct result;
880 testClient.testMultiException(result, "Xception2", "test 2");
Jens Geyerd629ea02015-09-23 21:16:50 +0200881 printf(" result\n*** FAILED ***\n");
882 return_code |= ERR_EXCEPTIONS;
David Reiss0c90f6f2008-02-06 22:18:40 +0000883
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100884 } catch (Xception2& e) {
Marc Slemko71d4e472006-08-15 22:34:04 +0000885 printf(" {%u, {\"%s\"}}\n", e.errorCode, e.struct_thing.string_thing.c_str());
Marc Slemkobf4fd192006-08-15 21:29:39 +0000886 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000887
Marc Slemko71d4e472006-08-15 22:34:04 +0000888 try {
889 printf("testClient.testMultiException(\"success\", \"test 3\") =>");
Mark Slee1921d202007-01-24 19:43:06 +0000890 Xtruct result;
891 testClient.testMultiException(result, "success", "test 3");
Marc Slemko71d4e472006-08-15 22:34:04 +0000892 printf(" {{\"%s\"}}\n", result.string_thing.c_str());
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100893 } catch (...) {
Jens Geyerd629ea02015-09-23 21:16:50 +0200894 printf(" exception\n*** FAILED ***\n");
895 return_code |= ERR_EXCEPTIONS;
Marc Slemko71d4e472006-08-15 22:34:04 +0000896 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000897
David Reissc51986f2009-03-24 20:01:25 +0000898 /* test oneway void */
David Reiss2ab6fe82008-02-18 02:11:44 +0000899 {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100900 printf("testClient.testOneway(1) =>");
901 uint64_t startOneway = now();
902 testClient.testOneway(1);
903 uint64_t elapsed = now() - startOneway;
904 if (elapsed > 200 * 1000) { // 0.2 seconds
Jens Geyerd629ea02015-09-23 21:16:50 +0200905 printf("*** FAILED *** - took %.2f ms\n", (double)elapsed / 1000.0);
906 return_code |= ERR_BASETYPES;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100907 } else {
908 printf(" success - took %.2f ms\n", (double)elapsed / 1000.0);
909 }
David Reiss2ab6fe82008-02-18 02:11:44 +0000910 }
911
David Reiss2845b522008-02-18 02:11:52 +0000912 /**
David Reissc51986f2009-03-24 20:01:25 +0000913 * redo a simple test after the oneway to make sure we aren't "off by one" --
914 * if the server treated oneway void like normal void, this next test will
David Reiss2845b522008-02-18 02:11:52 +0000915 * fail since it will get the void confirmation rather than the correct
916 * result. In this circumstance, the client will throw the exception:
917 *
918 * TApplicationException: Wrong method namea
919 */
920 /**
921 * I32 TEST
922 */
923 printf("re-test testI32(-1)");
924 i32 = testClient.testI32(-1);
925 printf(" = %d\n", i32);
Roger Meier4fce9602012-05-04 06:22:09 +0000926 if (i32 != -1)
Jens Geyerd629ea02015-09-23 21:16:50 +0200927 return_code |= ERR_BASETYPES;
David Reiss2845b522008-02-18 02:11:52 +0000928
Marc Slemkobf4fd192006-08-15 21:29:39 +0000929 uint64_t stop = now();
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100930 uint64_t tot = stop - start;
Mark Sleed788b2e2006-09-07 01:26:35 +0000931
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100932 printf("Total time: %" PRIu64 " us\n", stop - start);
David Reiss0c90f6f2008-02-06 22:18:40 +0000933
Mark Sleed788b2e2006-09-07 01:26:35 +0000934 time_tot += tot;
935 if (time_min == 0 || tot < time_min) {
936 time_min = tot;
937 }
938 if (tot > time_max) {
939 time_max = tot;
940 }
941
Mark Sleea3302652006-10-25 19:03:32 +0000942 transport->close();
Mark Sleee8540632006-05-30 09:24:40 +0000943 }
944
Mark Sleee8540632006-05-30 09:24:40 +0000945 printf("\nAll tests done.\n");
Mark Sleed788b2e2006-09-07 01:26:35 +0000946
947 uint64_t time_avg = time_tot / numTests;
948
Roger Meier0e814802014-01-17 21:07:58 +0100949 printf("Min time: %" PRIu64 " us\n", time_min);
950 printf("Max time: %" PRIu64 " us\n", time_max);
951 printf("Avg time: %" PRIu64 " us\n", time_avg);
Mark Sleed788b2e2006-09-07 01:26:35 +0000952
Jens Geyerd629ea02015-09-23 21:16:50 +0200953 return return_code;
Mark Sleee8540632006-05-30 09:24:40 +0000954}