blob: 6e7ff8e6680b4d23c0fb6e316490aeb07a0df28d [file] [log] [blame]
James E. King, III7edc8fa2017-01-20 10:11:41 -05001/*
David Reissea2cba82009-03-30 21:35:00 +00002 * 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
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +090020#include <limits>
21#include <locale>
22#include <ios>
Roger Meierca142b02011-06-07 17:59:07 +000023#include <iostream>
Sebastian Zenker39e505c2015-12-18 16:15:08 +010024#include <sstream>
Roger Meier49ff8b12012-04-13 09:12:31 +000025#include <thrift/protocol/TBinaryProtocol.h>
Roger Meier023192f2014-02-12 09:35:12 +010026#include <thrift/protocol/TCompactProtocol.h>
Dave Watson792db4e2015-01-16 11:22:01 -080027#include <thrift/protocol/THeaderProtocol.h>
Roger Meier49ff8b12012-04-13 09:12:31 +000028#include <thrift/protocol/TJSONProtocol.h>
James E. King, III58402ff2017-11-17 14:41:46 -050029#include <thrift/protocol/TMultiplexedProtocol.h>
Roger Meier49ff8b12012-04-13 09:12:31 +000030#include <thrift/transport/THttpClient.h>
31#include <thrift/transport/TTransportUtils.h>
32#include <thrift/transport/TSocket.h>
33#include <thrift/transport/TSSLSocket.h>
34#include <thrift/async/TEvhttpClientChannel.h>
35#include <thrift/server/TNonblockingServer.h> // <event.h>
Mark Sleee8540632006-05-30 09:24:40 +000036
James E. King, III7edc8fa2017-01-20 10:11:41 -050037#ifdef HAVE_STDINT_H
38#include <stdint.h>
39#endif
40#ifdef HAVE_INTTYPES_H
41#include <inttypes.h>
42#endif
43
James E. King, III58402ff2017-11-17 14:41:46 -050044#include <boost/algorithm/string.hpp>
cdwijayarathnaa07ec0b2014-08-09 17:45:56 +053045#include <boost/filesystem.hpp>
James E. King, III58402ff2017-11-17 14:41:46 -050046#include <boost/program_options.hpp>
James E. King, III82ae9572017-08-05 12:23:54 -040047#include <thrift/stdcxx.h>
Jake Farrell5d02b802014-01-07 21:42:01 -050048#if _WIN32
Konrad Grochowski16a23a62014-11-13 15:33:38 +010049#include <thrift/windows/TWinsockSingleton.h>
Jake Farrell5d02b802014-01-07 21:42:01 -050050#endif
Roger Meierca142b02011-06-07 17:59:07 +000051
James E. King, III58402ff2017-11-17 14:41:46 -050052#include "SecondService.h"
Marc Slemko6be374b2006-08-04 03:16:25 +000053#include "ThriftTest.h"
54
Marc Slemko6be374b2006-08-04 03:16:25 +000055using namespace std;
T Jake Lucianib5e62212009-01-31 22:36:20 +000056using namespace apache::thrift;
James E. King, III82ae9572017-08-05 12:23:54 -040057using namespace apache::thrift::async;
T Jake Lucianib5e62212009-01-31 22:36:20 +000058using namespace apache::thrift::protocol;
59using namespace apache::thrift::transport;
Marc Slemkobf4fd192006-08-15 21:29:39 +000060using namespace thrift::test;
Roger Meier7e056e72011-07-17 07:28:28 +000061
Mark Slee95771002006-06-07 06:53:25 +000062// Current time, microseconds since the epoch
Konrad Grochowski16a23a62014-11-13 15:33:38 +010063uint64_t now() {
Roger Meier5f9614c2010-11-21 16:59:05 +000064 int64_t ret;
Mark Slee95771002006-06-07 06:53:25 +000065 struct timeval tv;
David Reiss0c90f6f2008-02-06 22:18:40 +000066
Jake Farrell5d02b802014-01-07 21:42:01 -050067 THRIFT_GETTIMEOFDAY(&tv, NULL);
Mark Slee95771002006-06-07 06:53:25 +000068 ret = tv.tv_sec;
Konrad Grochowski16a23a62014-11-13 15:33:38 +010069 ret = ret * 1000 * 1000 + tv.tv_usec;
Mark Slee95771002006-06-07 06:53:25 +000070 return ret;
71}
72
Sebastian Zenker39e505c2015-12-18 16:15:08 +010073static void testString_clientReturn(event_base* base,
74 int testNr,
Konrad Grochowski16a23a62014-11-13 15:33:38 +010075 ThriftTestCobClient* client) {
Roger Meier7e056e72011-07-17 07:28:28 +000076 try {
77 string s;
78 client->recv_testString(s);
Sebastian Zenker39e505c2015-12-18 16:15:08 +010079 std::ostringstream os;
80 os << "test" << testNr;
81 const bool ok = (s == os.str());
82 cout << "testString: " << s << " " << ((ok) ? "ok" : "failed") << endl;
Roger Meier7e056e72011-07-17 07:28:28 +000083 } catch (TException& exn) {
Jake Farrell5d02b802014-01-07 21:42:01 -050084 cout << "Error: " << exn.what() << endl;
Roger Meier7e056e72011-07-17 07:28:28 +000085 }
86
Sebastian Zenker39e505c2015-12-18 16:15:08 +010087 if (testNr == 9)
88 event_base_loopbreak(base); // end test
Roger Meier7e056e72011-07-17 07:28:28 +000089}
90
Sebastian Zenker39e505c2015-12-18 16:15:08 +010091static void testVoid_clientReturn(event_base* base, ThriftTestCobClient* client) {
Roger Meier7e056e72011-07-17 07:28:28 +000092 try {
93 client->recv_testVoid();
94 cout << "testVoid" << endl;
95
Sebastian Zenker39e505c2015-12-18 16:15:08 +010096 for (int testNr = 0; testNr < 10; ++testNr) {
97 std::ostringstream os;
98 os << "test" << testNr;
James E. King, III82ae9572017-08-05 12:23:54 -040099 client->testString(stdcxx::bind(testString_clientReturn,
Sebastian Zenker39e505c2015-12-18 16:15:08 +0100100 base,
101 testNr,
James E. King, III82ae9572017-08-05 12:23:54 -0400102 stdcxx::placeholders::_1),
Sebastian Zenker39e505c2015-12-18 16:15:08 +0100103 os.str());
104 }
Roger Meier7e056e72011-07-17 07:28:28 +0000105 } catch (TException& exn) {
Jake Farrell5d02b802014-01-07 21:42:01 -0500106 cout << "Error: " << exn.what() << endl;
Roger Meier7e056e72011-07-17 07:28:28 +0000107 }
108}
109
Nobuaki Sukegawa228b3282015-10-10 03:11:49 +0900110// Workaround for absense of C++11 "auto" keyword.
111template <typename T>
112bool print_eq(T expected, T actual) {
113 cout << "(" << actual << ")" << endl;
114 if (expected != actual) {
115 cout << "*** FAILED ***" << endl << "Expected: " << expected << " but got: " << actual << endl;
116 return false;
117 }
118 return true;
119}
120
121#define BASETYPE_IDENTITY_TEST(func, value) \
122 cout << #func "(" << value << ") = "; \
123 try { \
124 if (!print_eq(value, testClient.func(value))) \
125 return_code |= ERR_BASETYPES; \
126 } catch (TTransportException&) { \
127 throw; \
128 } catch (exception & ex) { \
129 cout << "*** FAILED ***" << endl << ex.what() << endl; \
130 return_code |= ERR_BASETYPES; \
131 }
132
Mark Sleee8540632006-05-30 09:24:40 +0000133int main(int argc, char** argv) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900134 cout.precision(19);
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900135 int ERR_BASETYPES = 1;
136 int ERR_STRUCTS = 2;
137 int ERR_CONTAINERS = 4;
138 int ERR_EXCEPTIONS = 8;
139 int ERR_UNKNOWN = 64;
140
James E. King, III06190872017-02-20 08:52:11 -0500141 string testDir = boost::filesystem::system_complete(argv[0]).parent_path().parent_path().parent_path().string();
142 string caPath = testDir + "/keys/CA.pem";
143 string certPath = testDir + "/keys/client.crt";
144 string keyPath = testDir + "/keys/client.key";
145
Jake Farrell5d02b802014-01-07 21:42:01 -0500146#if _WIN32
147 transport::TWinsockSingleton::create();
148#endif
Mark Sleee8540632006-05-30 09:24:40 +0000149 string host = "localhost";
150 int port = 9090;
151 int numTests = 1;
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000152 bool ssl = false;
Roger Meierca142b02011-06-07 17:59:07 +0000153 string transport_type = "buffered";
154 string protocol_type = "binary";
155 string domain_socket = "";
pavlodd08f6e2015-10-08 16:43:56 -0400156 bool abstract_namespace = false;
Jens Geyerf4598682014-05-08 23:18:44 +0200157 bool noinsane = false;
Mark Sleee8540632006-05-30 09:24:40 +0000158
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900159 int return_code = 0;
160
Jake Farrell5d02b802014-01-07 21:42:01 -0500161 boost::program_options::options_description desc("Allowed options");
James E. King, III58402ff2017-11-17 14:41:46 -0500162 desc.add_options()
163 ("help,h", "produce help message")
164 ("host",
165 boost::program_options::value<string>(&host)->default_value(host),
166 "Host to connect")
167 ("port",
168 boost::program_options::value<int>(&port)->default_value(port),
169 "Port number to connect")
170 ("domain-socket",
171 boost::program_options::value<string>(&domain_socket)->default_value(domain_socket),
172 "Domain Socket (e.g. /tmp/ThriftTest.thrift), instead of host and port")
173 ("abstract-namespace",
174 "Look for the domain socket in the Abstract Namespace"
175 " (no connection with filesystem pathnames)")
176 ("transport",
177 boost::program_options::value<string>(&transport_type)->default_value(transport_type),
178 "Transport: buffered, framed, http, evhttp")
179 ("protocol",
180 boost::program_options::value<string>(&protocol_type)->default_value(protocol_type),
181 "Protocol: binary, compact, header, json, multi, multic, multih, multij")
182 ("ssl",
183 "Encrypted Transport using SSL")
184 ("testloops,n",
185 boost::program_options::value<int>(&numTests)->default_value(numTests),
186 "Number of Tests")
187 ("noinsane",
188 "Do not run insanity test");
Roger Meierca142b02011-06-07 17:59:07 +0000189
Jake Farrell5d02b802014-01-07 21:42:01 -0500190 boost::program_options::variables_map vm;
191 boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm);
192 boost::program_options::notify(vm);
Roger Meierca142b02011-06-07 17:59:07 +0000193
194 if (vm.count("help")) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900195 cout << desc << endl;
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900196 return ERR_UNKNOWN;
Mark Sleee8540632006-05-30 09:24:40 +0000197 }
Mark Sleea3302652006-10-25 19:03:32 +0000198
Jake Farrell5d02b802014-01-07 21:42:01 -0500199 try {
Roger Meierca142b02011-06-07 17:59:07 +0000200 if (!protocol_type.empty()) {
201 if (protocol_type == "binary") {
Roger Meier284101c2014-03-11 21:20:35 +0100202 } else if (protocol_type == "compact") {
Dave Watson792db4e2015-01-16 11:22:01 -0800203 } else if (protocol_type == "header") {
Roger Meierca142b02011-06-07 17:59:07 +0000204 } else if (protocol_type == "json") {
James E. King, III58402ff2017-11-17 14:41:46 -0500205 } else if (protocol_type == "multi") {
206 } else if (protocol_type == "multic") {
207 } else if (protocol_type == "multih") {
208 } else if (protocol_type == "multij") {
Roger Meierca142b02011-06-07 17:59:07 +0000209 } else {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100210 throw invalid_argument("Unknown protocol type " + protocol_type);
Roger Meierca142b02011-06-07 17:59:07 +0000211 }
212 }
213
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100214 if (!transport_type.empty()) {
Roger Meierca142b02011-06-07 17:59:07 +0000215 if (transport_type == "buffered") {
216 } else if (transport_type == "framed") {
217 } else if (transport_type == "http") {
Roger Meier7e056e72011-07-17 07:28:28 +0000218 } else if (transport_type == "evhttp") {
Roger Meierca142b02011-06-07 17:59:07 +0000219 } else {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100220 throw invalid_argument("Unknown transport type " + transport_type);
Roger Meierca142b02011-06-07 17:59:07 +0000221 }
222 }
223
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900224 } catch (exception& e) {
Roger Meierca142b02011-06-07 17:59:07 +0000225 cerr << e.what() << endl;
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900226 cout << desc << endl;
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900227 return ERR_UNKNOWN;
Roger Meierca142b02011-06-07 17:59:07 +0000228 }
229
230 if (vm.count("ssl")) {
231 ssl = true;
232 }
cdwijayarathnaa07ec0b2014-08-09 17:45:56 +0530233
pavlodd08f6e2015-10-08 16:43:56 -0400234 if (vm.count("abstract-namespace")) {
235 abstract_namespace = true;
236 }
237
Jens Geyerf4598682014-05-08 23:18:44 +0200238 if (vm.count("noinsane")) {
239 noinsane = true;
240 }
Roger Meierca142b02011-06-07 17:59:07 +0000241
James E. King, III7f5a8c22017-04-04 09:36:38 -0400242 // THRIFT-4164: The factory MUST outlive any sockets it creates for correct behavior!
James E. King, III82ae9572017-08-05 12:23:54 -0400243 stdcxx::shared_ptr<TSSLSocketFactory> factory;
244 stdcxx::shared_ptr<TSocket> socket;
245 stdcxx::shared_ptr<TTransport> transport;
246 stdcxx::shared_ptr<TProtocol> protocol;
James E. King, III58402ff2017-11-17 14:41:46 -0500247 stdcxx::shared_ptr<TProtocol> protocol2; // SecondService for multiplexed
Roger Meierca142b02011-06-07 17:59:07 +0000248
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000249 if (ssl) {
James E. King, III06190872017-02-20 08:52:11 -0500250 cout << "Client Certificate File: " << certPath << endl;
251 cout << "Client Key File: " << keyPath << endl;
252 cout << "CA File: " << caPath << endl;
253
James E. King, III82ae9572017-08-05 12:23:54 -0400254 factory = stdcxx::shared_ptr<TSSLSocketFactory>(new TSSLSocketFactory());
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000255 factory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
James E. King, III06190872017-02-20 08:52:11 -0500256 factory->loadTrustedCertificates(caPath.c_str());
257 factory->loadCertificate(certPath.c_str());
258 factory->loadPrivateKey(keyPath.c_str());
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000259 factory->authenticate(true);
260 socket = factory->createSocket(host, port);
261 } else {
Roger Meierca142b02011-06-07 17:59:07 +0000262 if (domain_socket != "") {
pavlodd08f6e2015-10-08 16:43:56 -0400263 if (abstract_namespace) {
264 std::string abstract_socket("\0", 1);
265 abstract_socket += domain_socket;
James E. King, III82ae9572017-08-05 12:23:54 -0400266 socket = stdcxx::shared_ptr<TSocket>(new TSocket(abstract_socket));
pavlodd08f6e2015-10-08 16:43:56 -0400267 } else {
James E. King, III82ae9572017-08-05 12:23:54 -0400268 socket = stdcxx::shared_ptr<TSocket>(new TSocket(domain_socket));
pavlodd08f6e2015-10-08 16:43:56 -0400269 }
Roger Meierca142b02011-06-07 17:59:07 +0000270 port = 0;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100271 } else {
James E. King, III82ae9572017-08-05 12:23:54 -0400272 socket = stdcxx::shared_ptr<TSocket>(new TSocket(host, port));
Roger Meierca142b02011-06-07 17:59:07 +0000273 }
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000274 }
Mark Sleea3302652006-10-25 19:03:32 +0000275
Roger Meierca142b02011-06-07 17:59:07 +0000276 if (transport_type.compare("http") == 0) {
James E. King, III82ae9572017-08-05 12:23:54 -0400277 stdcxx::shared_ptr<TTransport> httpSocket(new THttpClient(socket, host, "/service"));
Roger Meierca142b02011-06-07 17:59:07 +0000278 transport = httpSocket;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100279 } else if (transport_type.compare("framed") == 0) {
James E. King, III82ae9572017-08-05 12:23:54 -0400280 stdcxx::shared_ptr<TFramedTransport> framedSocket(new TFramedTransport(socket));
Mark Sleea3302652006-10-25 19:03:32 +0000281 transport = framedSocket;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100282 } else {
James E. King, III82ae9572017-08-05 12:23:54 -0400283 stdcxx::shared_ptr<TBufferedTransport> bufferedSocket(new TBufferedTransport(socket));
Mark Sleea3302652006-10-25 19:03:32 +0000284 transport = bufferedSocket;
285 }
286
James E. King, III58402ff2017-11-17 14:41:46 -0500287 if (protocol_type == "json" || protocol_type == "multij") {
288 protocol = stdcxx::make_shared<TJSONProtocol>(transport);
289 } else if (protocol_type == "compact" || protocol_type == "multic") {
290 protocol = stdcxx::make_shared<TCompactProtocol>(transport);
291 } else if (protocol_type == "header" || protocol_type == "multih") {
292 protocol = stdcxx::make_shared<THeaderProtocol>(transport);
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100293 } else {
James E. King, III58402ff2017-11-17 14:41:46 -0500294 protocol = stdcxx::make_shared<TBinaryProtocol>(transport);
295 }
296
297 if (boost::starts_with(protocol_type, "multi")) {
298 protocol2 = stdcxx::make_shared<TMultiplexedProtocol>(protocol, "SecondService");
299 // we don't need access to the original protocol any more, so...
300 protocol = stdcxx::make_shared<TMultiplexedProtocol>(protocol, "ThriftTest");
Roger Meierca142b02011-06-07 17:59:07 +0000301 }
302
303 // Connection info
pavlodd08f6e2015-10-08 16:43:56 -0400304 cout << "Connecting (" << transport_type << "/" << protocol_type << ") to: ";
305 if (abstract_namespace) {
306 cout << '@';
307 }
308 cout << domain_socket;
Roger Meierca142b02011-06-07 17:59:07 +0000309 if (port != 0) {
310 cout << host << ":" << port;
311 }
312 cout << endl;
313
Roger Meier7e056e72011-07-17 07:28:28 +0000314 if (transport_type.compare("evhttp") == 0) {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100315 event_base* base = event_base_new();
Roger Meier7e056e72011-07-17 07:28:28 +0000316 cout << "Libevent Version: " << event_get_version() << endl;
317 cout << "Libevent Method: " << event_base_get_method(base) << endl;
318#if LIBEVENT_VERSION_NUMBER >= 0x02000000
319 cout << "Libevent Features: 0x" << hex << event_base_get_features(base) << endl;
320#endif
321
James E. King, III82ae9572017-08-05 12:23:54 -0400322 stdcxx::shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
Roger Meier7e056e72011-07-17 07:28:28 +0000323
James E. King, III82ae9572017-08-05 12:23:54 -0400324 stdcxx::shared_ptr<TAsyncChannel> channel(
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100325 new TEvhttpClientChannel(host.c_str(), "/", host.c_str(), port, base));
Roger Meier7e056e72011-07-17 07:28:28 +0000326 ThriftTestCobClient* client = new ThriftTestCobClient(channel, protocolFactory.get());
James E. King, III82ae9572017-08-05 12:23:54 -0400327 client->testVoid(stdcxx::bind(testVoid_clientReturn,
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100328 base,
James E. King, III82ae9572017-08-05 12:23:54 -0400329 stdcxx::placeholders::_1));
Jake Farrell5d02b802014-01-07 21:42:01 -0500330
Roger Meier7e056e72011-07-17 07:28:28 +0000331 event_base_loop(base, 0);
332 return 0;
333 }
334
Roger Meierca142b02011-06-07 17:59:07 +0000335 ThriftTestClient testClient(protocol);
Mark Sleed788b2e2006-09-07 01:26:35 +0000336
337 uint64_t time_min = 0;
338 uint64_t time_max = 0;
339 uint64_t time_tot = 0;
David Reiss0c90f6f2008-02-06 22:18:40 +0000340
Mark Sleee8540632006-05-30 09:24:40 +0000341 int test = 0;
342 for (test = 0; test < numTests; ++test) {
Mark Slee95771002006-06-07 06:53:25 +0000343
Mark Slee95771002006-06-07 06:53:25 +0000344 try {
Mark Sleea3302652006-10-25 19:03:32 +0000345 transport->open();
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900346 } catch (TTransportException& ex) {
347 cout << "Connect failed: " << ex.what() << endl;
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900348 return ERR_UNKNOWN;
Mark Sleee8540632006-05-30 09:24:40 +0000349 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000350
Mark Sleed788b2e2006-09-07 01:26:35 +0000351 /**
352 * CONNECT TEST
353 */
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100354 printf("Test #%d, connect %s:%d\n", test + 1, host.c_str(), port);
Mark Slee95771002006-06-07 06:53:25 +0000355
356 uint64_t start = now();
David Reiss0c90f6f2008-02-06 22:18:40 +0000357
Mark Sleee8540632006-05-30 09:24:40 +0000358 /**
359 * VOID TEST
360 */
Mark Sleee129a2d2007-02-21 05:17:48 +0000361 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900362 cout << "testVoid()" << flush;
Mark Sleee129a2d2007-02-21 05:17:48 +0000363 testClient.testVoid();
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900364 cout << " = void" << endl;
365 } catch (TTransportException&) {
366 // Stop here if transport got broken
367 throw;
368 } catch (exception& ex) {
369 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200370 return_code |= ERR_BASETYPES;
Mark Sleee129a2d2007-02-21 05:17:48 +0000371 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000372
Mark Sleee8540632006-05-30 09:24:40 +0000373 /**
374 * STRING TEST
375 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900376 cout << "testString(\"Test\")" << flush;
Mark Slee1921d202007-01-24 19:43:06 +0000377 string s;
378 testClient.testString(s, "Test");
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900379 cout << " = " << s << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200380 if (s != "Test") {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900381 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200382 return_code |= ERR_BASETYPES;
383 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000384
James E. King, III58402ff2017-11-17 14:41:46 -0500385 //
386 // Multiplexed protocol - call another service method
387 // in the middle of the ThriftTest
388 //
389 if (boost::starts_with(protocol_type, "multi")) {
390 SecondServiceClient ssc(protocol2);
391 // transport is already open...
392
393 try {
394 cout << "secondService.secondTestString(\"foo\") => " << flush;
395 std::string result;
396 ssc.secondtestString(result, "foo");
397 cout << "{" << result << "}" << endl;
398 } catch (std::exception& e) {
399 cout << " *** FAILED *** " << e.what() << endl;
400 return_code |= ERR_EXCEPTIONS;
401 }
402 }
403
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900404 try {
James E. King, III7edc8fa2017-01-20 10:11:41 -0500405#ifdef _MSC_VER
406#pragma warning( push )
407#pragma warning( disable : 4566 )
408#endif
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900409 string str(
410 "}{Afrikaans, Alemannisch, Aragonés, العربية, مصرى, "
411 "Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, "
412 "Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, "
413 "বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, "
414 "Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, "
415 "Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, "
416 "Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, "
417 "Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, "
418 "Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, "
419 "Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, "
420 "Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, "
421 "ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, "
422 "Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, "
423 "Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa "
424 "Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, مازِرونی, Bahasa "
425 "Melayu, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪"
426 "Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, "
427 "Occitan, Иронау, Papiamentu, Deitsch, Polski, پنجابی, پښتو, "
428 "Norfuk / Pitkern, Português, Runa Simi, Rumantsch, Romani, Română, "
429 "Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple "
430 "English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, "
431 "Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, "
432 "Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, "
433 "Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, "
434 "Bân-lâm-gú, 粵語");
James E. King, III7edc8fa2017-01-20 10:11:41 -0500435#ifdef _MSC_VER
436#pragma warning( pop )
437#endif
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900438 cout << "testString(" << str << ") = " << flush;
439 testClient.testString(s, str);
440 cout << s << endl;
441 if (s != str) {
442 cout.imbue(locale("en_US.UTF8"));
443 cout << "*** FAILED ***" << endl << "Expected string: " << str << " but got: " << s << endl << "CLEAR";
444 return_code |= ERR_BASETYPES;
445 }
446 } catch (TTransportException&) {
447 throw;
448 } catch (exception& ex) {
449 cout << "*** FAILED ***" << endl << ex.what() << endl;
450 return_code |= ERR_BASETYPES;
451 return return_code;
452 }
453 try {
454 string str(
455 "quote: \" backslash:"
456 " forwardslash-escaped: \\/ "
457 " backspace: \b formfeed: \f newline: \n return: \r tab: "
458 " now-all-of-them-together: \"\\\\/\b\n\r\t"
459 " now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><"
460 " char-to-test-json-parsing: ]] \"]] \\\" }}}{ [[[ ");
461 cout << "testString(" << str << ") = " << flush;
462 testClient.testString(s, str);
463 cout << s << endl;
464 if (s != str) {
465 cout.imbue(locale("en_US.UTF8"));
466 cout << "*** FAILED ***" << endl
467 << "Expected string: " << str << " but got: " << s << endl
468 << "CLEAR";
469 ;
470 return_code |= ERR_BASETYPES;
471 }
472 } catch (TTransportException&) {
473 throw;
474 } catch (exception& ex) {
475 cout << "*** FAILED ***" << endl << ex.what() << endl;
476 return_code |= ERR_BASETYPES;
477 return return_code;
478 }
479
Mark Sleee8540632006-05-30 09:24:40 +0000480 /**
Nobuaki Sukegawaa649e742015-09-21 13:53:25 +0900481 * BOOL TEST
482 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900483 cout << boolalpha;
484 BASETYPE_IDENTITY_TEST(testBool, true);
485 BASETYPE_IDENTITY_TEST(testBool, false);
Nobuaki Sukegawaa649e742015-09-21 13:53:25 +0900486
487 /**
Mark Sleee8540632006-05-30 09:24:40 +0000488 * BYTE TEST
489 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900490 BASETYPE_IDENTITY_TEST(testByte, (int8_t)0);
491 BASETYPE_IDENTITY_TEST(testByte, (int8_t)-1);
492 BASETYPE_IDENTITY_TEST(testByte, (int8_t)42);
493 BASETYPE_IDENTITY_TEST(testByte, (int8_t)-42);
494 BASETYPE_IDENTITY_TEST(testByte, (int8_t)127);
495 BASETYPE_IDENTITY_TEST(testByte, (int8_t)-128);
David Reiss0c90f6f2008-02-06 22:18:40 +0000496
Mark Sleee8540632006-05-30 09:24:40 +0000497 /**
498 * I32 TEST
499 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900500 BASETYPE_IDENTITY_TEST(testI32, 0);
501 BASETYPE_IDENTITY_TEST(testI32, -1);
502 BASETYPE_IDENTITY_TEST(testI32, 190000013);
503 BASETYPE_IDENTITY_TEST(testI32, -190000013);
504 BASETYPE_IDENTITY_TEST(testI32, numeric_limits<int32_t>::max());
505 BASETYPE_IDENTITY_TEST(testI32, numeric_limits<int32_t>::min());
Mark Sleee8540632006-05-30 09:24:40 +0000506
507 /**
Mark Sleee8540632006-05-30 09:24:40 +0000508 * I64 TEST
509 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900510 BASETYPE_IDENTITY_TEST(testI64, (int64_t)0);
511 BASETYPE_IDENTITY_TEST(testI64, (int64_t)-1);
512 BASETYPE_IDENTITY_TEST(testI64, (int64_t)7000000000000000123LL);
513 BASETYPE_IDENTITY_TEST(testI64, (int64_t)-7000000000000000123LL);
James E. King, III7edc8fa2017-01-20 10:11:41 -0500514 BASETYPE_IDENTITY_TEST(testI64, (int64_t)pow(static_cast<double>(2LL), 32));
515 BASETYPE_IDENTITY_TEST(testI64, (int64_t)-pow(static_cast<double>(2LL), 32));
516 BASETYPE_IDENTITY_TEST(testI64, (int64_t)pow(static_cast<double>(2LL), 32) + 1);
517 BASETYPE_IDENTITY_TEST(testI64, (int64_t)-pow(static_cast<double>(2LL), 32) - 1);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900518 BASETYPE_IDENTITY_TEST(testI64, numeric_limits<int64_t>::max());
519 BASETYPE_IDENTITY_TEST(testI64, numeric_limits<int64_t>::min());
Jens Geyer8bcfdd92014-12-14 03:14:26 +0100520
Mark Sleec98d0502006-09-06 02:42:25 +0000521 /**
522 * DOUBLE TEST
523 */
Nobuaki Sukegawa228b3282015-10-10 03:11:49 +0900524 // Comparing double values with plain equality because Thrift handles full precision of double
525 BASETYPE_IDENTITY_TEST(testDouble, 0.0);
526 BASETYPE_IDENTITY_TEST(testDouble, -1.0);
527 BASETYPE_IDENTITY_TEST(testDouble, -5.2098523);
528 BASETYPE_IDENTITY_TEST(testDouble, -0.000341012439638598279);
James E. King, III7edc8fa2017-01-20 10:11:41 -0500529 BASETYPE_IDENTITY_TEST(testDouble, pow(static_cast<double>(2), 32));
530 BASETYPE_IDENTITY_TEST(testDouble, pow(static_cast<double>(2), 32) + 1);
531 BASETYPE_IDENTITY_TEST(testDouble, pow(static_cast<double>(2), 53) - 1);
532 BASETYPE_IDENTITY_TEST(testDouble, -pow(static_cast<double>(2), 32));
533 BASETYPE_IDENTITY_TEST(testDouble, -pow(static_cast<double>(2), 32) - 1);
534 BASETYPE_IDENTITY_TEST(testDouble, -pow(static_cast<double>(2), 53) + 1);
Nobuaki Sukegawa228b3282015-10-10 03:11:49 +0900535
536 try {
James E. King, III7edc8fa2017-01-20 10:11:41 -0500537 double expected = pow(static_cast<double>(10), 307);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900538 cout << "testDouble(" << expected << ") = " << flush;
Nobuaki Sukegawa228b3282015-10-10 03:11:49 +0900539 double actual = testClient.testDouble(expected);
540 cout << "(" << actual << ")" << endl;
James E. King, III7edc8fa2017-01-20 10:11:41 -0500541 if (expected - actual > pow(static_cast<double>(10), 292)) {
Nobuaki Sukegawa228b3282015-10-10 03:11:49 +0900542 cout << "*** FAILED ***" << endl
543 << "Expected: " << expected << " but got: " << actual << endl;
544 }
545 } catch (TTransportException&) {
546 throw;
547 } catch (exception& ex) {
548 cout << "*** FAILED ***" << endl << ex.what() << endl;
549 return_code |= ERR_BASETYPES;
550 }
551
552 try {
James E. King, III7edc8fa2017-01-20 10:11:41 -0500553 double expected = pow(static_cast<double>(10), -292);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900554 cout << "testDouble(" << expected << ") = " << flush;
Nobuaki Sukegawa228b3282015-10-10 03:11:49 +0900555 double actual = testClient.testDouble(expected);
556 cout << "(" << actual << ")" << endl;
James E. King, III7edc8fa2017-01-20 10:11:41 -0500557 if (expected - actual > pow(static_cast<double>(10), -307)) {
Nobuaki Sukegawa228b3282015-10-10 03:11:49 +0900558 cout << "*** FAILED ***" << endl
559 << "Expected: " << expected << " but got: " << actual << endl;
560 }
561 } catch (TTransportException&) {
562 throw;
563 } catch (exception& ex) {
564 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200565 return_code |= ERR_BASETYPES;
566 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000567
Mark Sleee8540632006-05-30 09:24:40 +0000568 /**
Jens Geyer8bcfdd92014-12-14 03:14:26 +0100569 * BINARY TEST
570 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900571 cout << "testBinary(empty)" << endl;
Nobuaki Sukegawadfb68962015-12-09 22:09:26 +0900572 try {
573 string bin_result;
574 testClient.testBinary(bin_result, string());
575 if (!bin_result.empty()) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900576 cout << endl << "*** FAILED ***" << endl;
577 cout << "invalid length: " << bin_result.size() << endl;
Nobuaki Sukegawadfb68962015-12-09 22:09:26 +0900578 return_code |= ERR_BASETYPES;
579 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900580 } catch (TTransportException&) {
581 throw;
Nobuaki Sukegawadfb68962015-12-09 22:09:26 +0900582 } catch (exception& ex) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900583 cout << "*** FAILED ***" << endl << ex.what() << endl;
Nobuaki Sukegawadfb68962015-12-09 22:09:26 +0900584 return_code |= ERR_BASETYPES;
585 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900586 cout << "testBinary([-128..127]) = {" << flush;
Cody P Schafer31295492016-09-09 15:50:26 -0400587 const signed char bin_data[256]
Jens Geyerd629ea02015-09-23 21:16:50 +0200588 = {-128, -127, -126, -125, -124, -123, -122, -121, -120, -119, -118, -117, -116, -115, -114,
589 -113, -112, -111, -110, -109, -108, -107, -106, -105, -104, -103, -102, -101, -100, -99,
590 -98, -97, -96, -95, -94, -93, -92, -91, -90, -89, -88, -87, -86, -85, -84,
591 -83, -82, -81, -80, -79, -78, -77, -76, -75, -74, -73, -72, -71, -70, -69,
592 -68, -67, -66, -65, -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54,
593 -53, -52, -51, -50, -49, -48, -47, -46, -45, -44, -43, -42, -41, -40, -39,
594 -38, -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, -26, -25, -24,
595 -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9,
596 -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6,
597 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
598 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
599 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
600 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
601 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
602 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
603 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
604 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
605 127};
606 try {
607 string bin_result;
Cody P Schafer31295492016-09-09 15:50:26 -0400608 testClient.testBinary(bin_result, string(reinterpret_cast<const char *>(bin_data), 256));
Jens Geyerd629ea02015-09-23 21:16:50 +0200609 if (bin_result.size() != 256) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900610 cout << endl << "*** FAILED ***" << endl;
611 cout << "invalid length: " << bin_result.size() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200612 return_code |= ERR_BASETYPES;
613 } else {
614 bool first = true;
615 bool failed = false;
616 for (int i = 0; i < 256; ++i) {
617 if (!first)
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900618 cout << ",";
Jens Geyerd629ea02015-09-23 21:16:50 +0200619 else
620 first = false;
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900621 cout << static_cast<int>(bin_result[i]);
Jens Geyerd629ea02015-09-23 21:16:50 +0200622 if (!failed && bin_result[i] != i - 128) {
623 failed = true;
624 }
625 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900626 cout << "}" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200627 if (failed) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900628 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200629 return_code |= ERR_BASETYPES;
630 }
631 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900632 } catch (TTransportException&) {
633 throw;
Jens Geyerd629ea02015-09-23 21:16:50 +0200634 } catch (exception& ex) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900635 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200636 return_code |= ERR_BASETYPES;
637 }
638
Jens Geyer8bcfdd92014-12-14 03:14:26 +0100639
640 /**
Mark Sleee8540632006-05-30 09:24:40 +0000641 * STRUCT TEST
642 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900643 cout << "testStruct({\"Zero\", 1, -3, -5})" << flush;
Mark Sleee8540632006-05-30 09:24:40 +0000644 Xtruct out;
645 out.string_thing = "Zero";
646 out.byte_thing = 1;
Mark Sleee8540632006-05-30 09:24:40 +0000647 out.i32_thing = -3;
Mark Sleee8540632006-05-30 09:24:40 +0000648 out.i64_thing = -5;
Mark Slee1921d202007-01-24 19:43:06 +0000649 Xtruct in;
650 testClient.testStruct(in, out);
Roger Meier0e814802014-01-17 21:07:58 +0100651 printf(" = {\"%s\", %d, %d, %" PRId64 "}\n",
Mark Sleee8540632006-05-30 09:24:40 +0000652 in.string_thing.c_str(),
653 (int)in.byte_thing,
Mark Sleee8540632006-05-30 09:24:40 +0000654 in.i32_thing,
Mark Sleee8540632006-05-30 09:24:40 +0000655 in.i64_thing);
Jens Geyerd629ea02015-09-23 21:16:50 +0200656 if (in != out) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900657 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200658 return_code |= ERR_STRUCTS;
659 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000660
Mark Sleee8540632006-05-30 09:24:40 +0000661 /**
662 * NESTED STRUCT TEST
663 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900664 cout << "testNest({1, {\"Zero\", 1, -3, -5}), 5}" << flush;
Mark Sleee8540632006-05-30 09:24:40 +0000665 Xtruct2 out2;
666 out2.byte_thing = 1;
667 out2.struct_thing = out;
668 out2.i32_thing = 5;
Mark Slee1921d202007-01-24 19:43:06 +0000669 Xtruct2 in2;
670 testClient.testNest(in2, out2);
Mark Sleee8540632006-05-30 09:24:40 +0000671 in = in2.struct_thing;
Roger Meier0e814802014-01-17 21:07:58 +0100672 printf(" = {%d, {\"%s\", %d, %d, %" PRId64 "}, %d}\n",
Mark Sleee8540632006-05-30 09:24:40 +0000673 in2.byte_thing,
674 in.string_thing.c_str(),
675 (int)in.byte_thing,
Mark Sleee8540632006-05-30 09:24:40 +0000676 in.i32_thing,
Mark Sleee8540632006-05-30 09:24:40 +0000677 in.i64_thing,
David Reiss0c90f6f2008-02-06 22:18:40 +0000678 in2.i32_thing);
Jens Geyerd629ea02015-09-23 21:16:50 +0200679 if (in2 != out2) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900680 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200681 return_code |= ERR_STRUCTS;
682 }
Mark Sleee8540632006-05-30 09:24:40 +0000683
684 /**
685 * MAP TEST
686 */
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100687 map<int32_t, int32_t> mapout;
Mark Sleee8540632006-05-30 09:24:40 +0000688 for (int32_t i = 0; i < 5; ++i) {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100689 mapout.insert(make_pair(i, i - 10));
Mark Sleee8540632006-05-30 09:24:40 +0000690 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900691 cout << "testMap({" << flush;
Mark Sleee8540632006-05-30 09:24:40 +0000692 map<int32_t, int32_t>::const_iterator m_iter;
693 bool first = true;
694 for (m_iter = mapout.begin(); m_iter != mapout.end(); ++m_iter) {
695 if (first) {
696 first = false;
697 } else {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900698 cout << ",";
Mark Sleee8540632006-05-30 09:24:40 +0000699 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900700 cout << m_iter->first << " => " << m_iter->second;
Mark Sleee8540632006-05-30 09:24:40 +0000701 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900702 cout << "})";
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100703 map<int32_t, int32_t> mapin;
Mark Slee1921d202007-01-24 19:43:06 +0000704 testClient.testMap(mapin, mapout);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900705 cout << " = {";
Mark Sleee8540632006-05-30 09:24:40 +0000706 first = true;
707 for (m_iter = mapin.begin(); m_iter != mapin.end(); ++m_iter) {
708 if (first) {
709 first = false;
710 } else {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900711 cout << ",";
Mark Sleee8540632006-05-30 09:24:40 +0000712 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900713 cout << m_iter->first << " => " << m_iter->second;
Mark Sleee8540632006-05-30 09:24:40 +0000714 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900715 cout << "}" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200716 if (mapin != mapout) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900717 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200718 return_code |= ERR_CONTAINERS;
719 }
Roger Meier4fce9602012-05-04 06:22:09 +0000720
721 /**
722 * STRING MAP TEST
Roger Meier4fce9602012-05-04 06:22:09 +0000723 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900724 cout << "testStringMap({a => 2, b => blah, some => thing}) = {" << flush;
Jens Geyerd629ea02015-09-23 21:16:50 +0200725 map<string, string> smapin;
726 map<string, string> smapout;
727 smapin["a"] = "2";
728 smapin["b"] = "blah";
729 smapin["some"] = "thing";
730 try {
731 testClient.testStringMap(smapout, smapin);
732 first = true;
733 for (map<string, string>::const_iterator it = smapout.begin(); it != smapout.end(); ++it) {
734 if (first)
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900735 cout << ",";
Jens Geyerd629ea02015-09-23 21:16:50 +0200736 else
737 first = false;
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900738 cout << it->first << " => " << it->second;
Jens Geyerd629ea02015-09-23 21:16:50 +0200739 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900740 cout << "}" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200741 if (smapin != smapout) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900742 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200743 return_code |= ERR_CONTAINERS;
744 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900745 } catch (TTransportException&) {
746 throw;
Jens Geyerd629ea02015-09-23 21:16:50 +0200747 } catch (exception& ex) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900748 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200749 return_code |= ERR_CONTAINERS;
750 }
Mark Sleee8540632006-05-30 09:24:40 +0000751
752 /**
753 * SET TEST
754 */
755 set<int32_t> setout;
756 for (int32_t i = -2; i < 3; ++i) {
757 setout.insert(i);
758 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900759 cout << "testSet({" << flush;
Mark Sleee8540632006-05-30 09:24:40 +0000760 set<int32_t>::const_iterator s_iter;
761 first = true;
762 for (s_iter = setout.begin(); s_iter != setout.end(); ++s_iter) {
763 if (first) {
764 first = false;
765 } else {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900766 cout << ",";
Mark Sleee8540632006-05-30 09:24:40 +0000767 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900768 cout << *s_iter;
Mark Sleee8540632006-05-30 09:24:40 +0000769 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900770 cout << "})";
Mark Slee1921d202007-01-24 19:43:06 +0000771 set<int32_t> setin;
772 testClient.testSet(setin, setout);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900773 cout << " = {";
Mark Sleee8540632006-05-30 09:24:40 +0000774 first = true;
775 for (s_iter = setin.begin(); s_iter != setin.end(); ++s_iter) {
776 if (first) {
777 first = false;
778 } else {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900779 cout << ",";
Mark Sleee8540632006-05-30 09:24:40 +0000780 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900781 cout << *s_iter;
Mark Sleee8540632006-05-30 09:24:40 +0000782 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900783 cout << "}" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200784 if (setin != setout) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900785 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200786 return_code |= ERR_CONTAINERS;
787 }
Mark Sleee8540632006-05-30 09:24:40 +0000788
789 /**
790 * LIST TEST
791 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900792 cout << "testList(empty)" << flush;
793 try {
794 vector<int32_t> listout;
795 testClient.testList(listout, vector<int32_t>());
796 if (!listout.empty()) {
797 cout << "*** FAILED ***" << endl;
798 cout << "invalid length: " << listout.size() << endl;
799 return_code |= ERR_CONTAINERS;
Mark Sleee8540632006-05-30 09:24:40 +0000800 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900801 } catch (TTransportException&) {
802 throw;
803 } catch (exception& ex) {
804 cout << "*** FAILED ***" << endl << ex.what() << endl;
805 return_code |= ERR_CONTAINERS;
Mark Sleee8540632006-05-30 09:24:40 +0000806 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900807 try {
808 vector<int32_t> listout;
809 for (int32_t i = -2; i < 3; ++i) {
810 listout.push_back(i);
Mark Sleee8540632006-05-30 09:24:40 +0000811 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900812 cout << "testList({" << flush;
813 vector<int32_t>::const_iterator l_iter;
814 first = true;
815 for (l_iter = listout.begin(); l_iter != listout.end(); ++l_iter) {
816 if (first) {
817 first = false;
818 } else {
819 cout << ",";
820 }
821 cout << *l_iter;
822 }
823 cout << "})";
824 vector<int32_t> listin;
825 testClient.testList(listin, listout);
826 cout << " = {";
827 first = true;
828 for (l_iter = listin.begin(); l_iter != listin.end(); ++l_iter) {
829 if (first) {
830 first = false;
831 } else {
832 cout << ",";
833 }
834 cout << *l_iter;
835 }
836 cout << "}" << endl;
837 if (listin != listout) {
838 cout << "*** FAILED ***" << endl;
839 return_code |= ERR_CONTAINERS;
840 }
841 } catch (TTransportException&) {
842 throw;
843 } catch (exception& ex) {
844 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200845 return_code |= ERR_CONTAINERS;
846 }
Mark Sleee8540632006-05-30 09:24:40 +0000847
848 /**
849 * ENUM TEST
850 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900851 cout << "testEnum(ONE)" << flush;
Bryan Duxbury833ae492010-09-27 17:26:02 +0000852 Numberz::type ret = testClient.testEnum(Numberz::ONE);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900853 cout << " = " << ret << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200854 if (ret != Numberz::ONE) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900855 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200856 return_code |= ERR_STRUCTS;
857 }
Mark Sleee8540632006-05-30 09:24:40 +0000858
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900859 cout << "testEnum(TWO)" << flush;
Bryan Duxbury833ae492010-09-27 17:26:02 +0000860 ret = testClient.testEnum(Numberz::TWO);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900861 cout << " = " << ret << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200862 if (ret != Numberz::TWO) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900863 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200864 return_code |= ERR_STRUCTS;
865 }
Mark Sleee8540632006-05-30 09:24:40 +0000866
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900867 cout << "testEnum(THREE)" << flush;
Bryan Duxbury833ae492010-09-27 17:26:02 +0000868 ret = testClient.testEnum(Numberz::THREE);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900869 cout << " = " << ret << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200870 if (ret != Numberz::THREE) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900871 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200872 return_code |= ERR_STRUCTS;
873 }
Mark Sleee8540632006-05-30 09:24:40 +0000874
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900875 cout << "testEnum(FIVE)" << flush;
Bryan Duxbury833ae492010-09-27 17:26:02 +0000876 ret = testClient.testEnum(Numberz::FIVE);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900877 cout << " = " << ret << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200878 if (ret != Numberz::FIVE) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900879 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200880 return_code |= ERR_STRUCTS;
881 }
Mark Sleee8540632006-05-30 09:24:40 +0000882
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900883 cout << "testEnum(EIGHT)" << flush;
Bryan Duxbury833ae492010-09-27 17:26:02 +0000884 ret = testClient.testEnum(Numberz::EIGHT);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900885 cout << " = " << ret << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200886 if (ret != Numberz::EIGHT) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900887 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200888 return_code |= ERR_STRUCTS;
889 }
Mark Sleee8540632006-05-30 09:24:40 +0000890
891 /**
892 * TYPEDEF TEST
893 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900894 cout << "testTypedef(309858235082523)" << flush;
Marc Slemkobf4fd192006-08-15 21:29:39 +0000895 UserId uid = testClient.testTypedef(309858235082523LL);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900896 cout << " = " << uid << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200897 if (uid != 309858235082523LL) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900898 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200899 return_code |= ERR_STRUCTS;
900 }
Mark Sleee8540632006-05-30 09:24:40 +0000901
902 /**
903 * NESTED MAP TEST
904 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900905 cout << "testMapMap(1)" << flush;
Mark Slee1921d202007-01-24 19:43:06 +0000906 map<int32_t, map<int32_t, int32_t> > mm;
907 testClient.testMapMap(mm, 1);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900908 cout << " = {";
Mark Sleee8540632006-05-30 09:24:40 +0000909 map<int32_t, map<int32_t, int32_t> >::const_iterator mi;
910 for (mi = mm.begin(); mi != mm.end(); ++mi) {
911 printf("%d => {", mi->first);
912 map<int32_t, int32_t>::const_iterator mi2;
913 for (mi2 = mi->second.begin(); mi2 != mi->second.end(); ++mi2) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900914 cout << mi2->first << " => " << mi2->second;
Mark Sleee8540632006-05-30 09:24:40 +0000915 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900916 cout << "}, ";
Mark Sleee8540632006-05-30 09:24:40 +0000917 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900918 cout << "}" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200919 if (mm.size() != 2 ||
920 mm[-4][-4] != -4 ||
921 mm[-4][-3] != -3 ||
922 mm[-4][-2] != -2 ||
923 mm[-4][-1] != -1 ||
924 mm[4][4] != 4 ||
925 mm[4][3] != 3 ||
926 mm[4][2] != 2 ||
927 mm[4][1] != 1) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900928 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200929 return_code |= ERR_CONTAINERS;
930 }
Mark Sleee8540632006-05-30 09:24:40 +0000931
932 /**
933 * INSANITY TEST
934 */
Jens Geyerf4598682014-05-08 23:18:44 +0200935 if (!noinsane) {
936 Insanity insane;
Jens Geyerd629ea02015-09-23 21:16:50 +0200937 insane.userMap.insert(make_pair(Numberz::FIVE, 5));
938 insane.userMap.insert(make_pair(Numberz::EIGHT, 8));
Jens Geyerf4598682014-05-08 23:18:44 +0200939 Xtruct truck;
Jens Geyerd629ea02015-09-23 21:16:50 +0200940 truck.string_thing = "Goodbye4";
941 truck.byte_thing = 4;
942 truck.i32_thing = 4;
943 truck.i64_thing = 4;
944 Xtruct truck2;
945 truck2.string_thing = "Hello2";
946 truck2.byte_thing = 2;
947 truck2.i32_thing = 2;
948 truck2.i64_thing = 2;
Jens Geyerf4598682014-05-08 23:18:44 +0200949 insane.xtructs.push_back(truck);
Jens Geyerd629ea02015-09-23 21:16:50 +0200950 insane.xtructs.push_back(truck2);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900951 cout << "testInsanity()" << flush;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100952 map<UserId, map<Numberz::type, Insanity> > whoa;
Jens Geyerf4598682014-05-08 23:18:44 +0200953 testClient.testInsanity(whoa, insane);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900954 cout << " = {";
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100955 map<UserId, map<Numberz::type, Insanity> >::const_iterator i_iter;
Jens Geyerf4598682014-05-08 23:18:44 +0200956 for (i_iter = whoa.begin(); i_iter != whoa.end(); ++i_iter) {
957 printf("%" PRId64 " => {", i_iter->first);
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100958 map<Numberz::type, Insanity>::const_iterator i2_iter;
959 for (i2_iter = i_iter->second.begin(); i2_iter != i_iter->second.end(); ++i2_iter) {
Jens Geyerf4598682014-05-08 23:18:44 +0200960 printf("%d => {", i2_iter->first);
961 map<Numberz::type, UserId> userMap = i2_iter->second.userMap;
962 map<Numberz::type, UserId>::const_iterator um;
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900963 cout << "{";
Jens Geyerf4598682014-05-08 23:18:44 +0200964 for (um = userMap.begin(); um != userMap.end(); ++um) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900965 cout << um->first << " => " << um->second;
Jens Geyerf4598682014-05-08 23:18:44 +0200966 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900967 cout << "}, ";
Mark Sleee8540632006-05-30 09:24:40 +0000968
Jens Geyerf4598682014-05-08 23:18:44 +0200969 vector<Xtruct> xtructs = i2_iter->second.xtructs;
970 vector<Xtruct>::const_iterator x;
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900971 cout << "{";
Jens Geyerf4598682014-05-08 23:18:44 +0200972 for (x = xtructs.begin(); x != xtructs.end(); ++x) {
973 printf("{\"%s\", %d, %d, %" PRId64 "}, ",
974 x->string_thing.c_str(),
975 (int)x->byte_thing,
976 x->i32_thing,
977 x->i64_thing);
978 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900979 cout << "}";
Mark Sleee8540632006-05-30 09:24:40 +0000980
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900981 cout << "}, ";
Jens Geyerf4598682014-05-08 23:18:44 +0200982 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900983 cout << "}, ";
Mark Sleee8540632006-05-30 09:24:40 +0000984 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900985 cout << "}" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200986 bool failed = false;
987 map<UserId, map<Numberz::type, Insanity> >::const_iterator it1 = whoa.find(UserId(1));
988 if (whoa.size() != 2) {
989 failed = true;
990 }
991 if (it1 == whoa.end()) {
992 failed = true;
993 } else {
994 map<Numberz::type, Insanity>::const_iterator it12 = it1->second.find(Numberz::TWO);
995 if (it12 == it1->second.end() || it12->second != insane) {
996 failed = true;
997 }
998 map<Numberz::type, Insanity>::const_iterator it13 = it1->second.find(Numberz::THREE);
999 if (it13 == it1->second.end() || it13->second != insane) {
1000 failed = true;
1001 }
1002 }
1003 map<UserId, map<Numberz::type, Insanity> >::const_iterator it2 = whoa.find(UserId(2));
1004 if (it2 == whoa.end()) {
1005 failed = true;
1006 } else {
1007 map<Numberz::type, Insanity>::const_iterator it26 = it2->second.find(Numberz::SIX);
1008 if (it26 == it1->second.end() || it26->second != Insanity()) {
1009 failed = true;
1010 }
1011 }
1012 if (failed) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001013 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001014 return_code |= ERR_STRUCTS;
1015 }
Mark Sleee8540632006-05-30 09:24:40 +00001016 }
Jens Geyerd629ea02015-09-23 21:16:50 +02001017
1018 /**
1019 * MULTI TEST
1020 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001021 cout << "testMulti()" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001022 try {
1023 map<int16_t, string> mul_map;
1024 Xtruct mul_result;
1025 mul_map[1] = "blah";
1026 mul_map[2] = "thing";
1027 testClient.testMulti(mul_result, 42, 4242, 424242, mul_map, Numberz::EIGHT, UserId(24));
1028 Xtruct xxs;
1029 xxs.string_thing = "Hello2";
1030 xxs.byte_thing = 42;
1031 xxs.i32_thing = 4242;
1032 xxs.i64_thing = 424242;
1033 if (mul_result != xxs) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001034 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001035 return_code |= ERR_STRUCTS;
1036 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001037 } catch (TTransportException&) {
1038 throw;
Jens Geyerd629ea02015-09-23 21:16:50 +02001039 } catch (exception& ex) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001040 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001041 return_code |= ERR_STRUCTS;
1042 }
1043
Marc Slemko71d4e472006-08-15 22:34:04 +00001044 /* test exception */
Mark Slee95771002006-06-07 06:53:25 +00001045
Marc Slemkobf4fd192006-08-15 21:29:39 +00001046 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001047 cout << "testClient.testException(\"Xception\") =>" << flush;
Marc Slemko71d4e472006-08-15 22:34:04 +00001048 testClient.testException("Xception");
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001049 cout << " void\n*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001050 return_code |= ERR_EXCEPTIONS;
David Reiss0c90f6f2008-02-06 22:18:40 +00001051
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001052 } catch (Xception& e) {
Marc Slemko71d4e472006-08-15 22:34:04 +00001053 printf(" {%u, \"%s\"}\n", e.errorCode, e.message.c_str());
Marc Slemkobf4fd192006-08-15 21:29:39 +00001054 }
David Reiss0c90f6f2008-02-06 22:18:40 +00001055
Marc Slemkobf4fd192006-08-15 21:29:39 +00001056 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001057 cout << "testClient.testException(\"TException\") =>" << flush;
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001058 testClient.testException("TException");
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001059 cout << " void\n*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001060 return_code |= ERR_EXCEPTIONS;
Roger Meierf50df7f2012-05-02 22:49:55 +00001061
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001062 } catch (const TException&) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001063 cout << " Caught TException" << endl;
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001064 }
Roger Meierf50df7f2012-05-02 22:49:55 +00001065
1066 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001067 cout << "testClient.testException(\"success\") =>" << flush;
Marc Slemko71d4e472006-08-15 22:34:04 +00001068 testClient.testException("success");
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001069 cout << " void" << endl;
1070 } catch (exception & ex) { \
1071 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001072 return_code |= ERR_EXCEPTIONS;
Marc Slemko71d4e472006-08-15 22:34:04 +00001073 }
David Reiss0c90f6f2008-02-06 22:18:40 +00001074
Marc Slemko71d4e472006-08-15 22:34:04 +00001075 /* test multi exception */
David Reiss0c90f6f2008-02-06 22:18:40 +00001076
Marc Slemko71d4e472006-08-15 22:34:04 +00001077 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001078 cout << "testClient.testMultiException(\"Xception\", \"test 1\") =>" << flush;
Mark Slee1921d202007-01-24 19:43:06 +00001079 Xtruct result;
1080 testClient.testMultiException(result, "Xception", "test 1");
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001081 cout << " result\n*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001082 return_code |= ERR_EXCEPTIONS;
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001083 } catch (Xception& e) {
Marc Slemko71d4e472006-08-15 22:34:04 +00001084 printf(" {%u, \"%s\"}\n", e.errorCode, e.message.c_str());
1085 }
1086
1087 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001088 cout << "testClient.testMultiException(\"Xception2\", \"test 2\") =>" << flush;
Mark Slee1921d202007-01-24 19:43:06 +00001089 Xtruct result;
1090 testClient.testMultiException(result, "Xception2", "test 2");
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001091 cout << " result\n*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001092 return_code |= ERR_EXCEPTIONS;
David Reiss0c90f6f2008-02-06 22:18:40 +00001093
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001094 } catch (Xception2& e) {
Marc Slemko71d4e472006-08-15 22:34:04 +00001095 printf(" {%u, {\"%s\"}}\n", e.errorCode, e.struct_thing.string_thing.c_str());
Marc Slemkobf4fd192006-08-15 21:29:39 +00001096 }
David Reiss0c90f6f2008-02-06 22:18:40 +00001097
Marc Slemko71d4e472006-08-15 22:34:04 +00001098 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001099 cout << "testClient.testMultiException(\"success\", \"test 3\") =>" << flush;
Mark Slee1921d202007-01-24 19:43:06 +00001100 Xtruct result;
1101 testClient.testMultiException(result, "success", "test 3");
Marc Slemko71d4e472006-08-15 22:34:04 +00001102 printf(" {{\"%s\"}}\n", result.string_thing.c_str());
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001103 } catch (exception & ex) { \
1104 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001105 return_code |= ERR_EXCEPTIONS;
Marc Slemko71d4e472006-08-15 22:34:04 +00001106 }
David Reiss0c90f6f2008-02-06 22:18:40 +00001107
David Reissc51986f2009-03-24 20:01:25 +00001108 /* test oneway void */
David Reiss2ab6fe82008-02-18 02:11:44 +00001109 {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001110 cout << "testClient.testOneway(1) =>" << flush;
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001111 uint64_t startOneway = now();
1112 testClient.testOneway(1);
1113 uint64_t elapsed = now() - startOneway;
1114 if (elapsed > 200 * 1000) { // 0.2 seconds
Jens Geyerd629ea02015-09-23 21:16:50 +02001115 printf("*** FAILED *** - took %.2f ms\n", (double)elapsed / 1000.0);
1116 return_code |= ERR_BASETYPES;
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001117 } else {
1118 printf(" success - took %.2f ms\n", (double)elapsed / 1000.0);
1119 }
David Reiss2ab6fe82008-02-18 02:11:44 +00001120 }
1121
David Reiss2845b522008-02-18 02:11:52 +00001122 /**
David Reissc51986f2009-03-24 20:01:25 +00001123 * redo a simple test after the oneway to make sure we aren't "off by one" --
1124 * if the server treated oneway void like normal void, this next test will
David Reiss2845b522008-02-18 02:11:52 +00001125 * fail since it will get the void confirmation rather than the correct
1126 * result. In this circumstance, the client will throw the exception:
1127 *
1128 * TApplicationException: Wrong method namea
1129 */
1130 /**
1131 * I32 TEST
1132 */
James E. King, III58402ff2017-11-17 14:41:46 -05001133 cout << "re-test testI32(-1)" << flush;
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001134 int i32 = testClient.testI32(-1);
1135 cout << " = " << i32 << endl;
Roger Meier4fce9602012-05-04 06:22:09 +00001136 if (i32 != -1)
Jens Geyerd629ea02015-09-23 21:16:50 +02001137 return_code |= ERR_BASETYPES;
David Reiss2845b522008-02-18 02:11:52 +00001138
James E. King, III58402ff2017-11-17 14:41:46 -05001139 cout << endl << "All tests done." << endl << flush;
1140
Marc Slemkobf4fd192006-08-15 21:29:39 +00001141 uint64_t stop = now();
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001142 uint64_t tot = stop - start;
Mark Sleed788b2e2006-09-07 01:26:35 +00001143
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001144 cout << "Total time: " << stop - start << " us" << endl;
David Reiss0c90f6f2008-02-06 22:18:40 +00001145
Mark Sleed788b2e2006-09-07 01:26:35 +00001146 time_tot += tot;
1147 if (time_min == 0 || tot < time_min) {
1148 time_min = tot;
1149 }
1150 if (tot > time_max) {
1151 time_max = tot;
1152 }
1153
James E. King, III58402ff2017-11-17 14:41:46 -05001154 cout << flush;
Mark Sleea3302652006-10-25 19:03:32 +00001155 transport->close();
Mark Sleee8540632006-05-30 09:24:40 +00001156 }
1157
Mark Sleed788b2e2006-09-07 01:26:35 +00001158
1159 uint64_t time_avg = time_tot / numTests;
1160
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001161 cout << "Min time: " << time_min << " us" << endl;
1162 cout << "Max time: " << time_max << " us" << endl;
1163 cout << "Avg time: " << time_avg << " us" << endl;
Mark Sleed788b2e2006-09-07 01:26:35 +00001164
Jens Geyerd629ea02015-09-23 21:16:50 +02001165 return return_code;
Mark Sleee8540632006-05-30 09:24:40 +00001166}