blob: 6aebcdc0a380c53eec01b3e96c59ad4570b57929 [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>
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +090022#include <limits>
23#include <locale>
24#include <ios>
Roger Meierca142b02011-06-07 17:59:07 +000025#include <iostream>
Sebastian Zenker39e505c2015-12-18 16:15:08 +010026#include <sstream>
Roger Meier49ff8b12012-04-13 09:12:31 +000027#include <thrift/protocol/TBinaryProtocol.h>
Roger Meier023192f2014-02-12 09:35:12 +010028#include <thrift/protocol/TCompactProtocol.h>
Dave Watson792db4e2015-01-16 11:22:01 -080029#include <thrift/protocol/THeaderProtocol.h>
Roger Meier49ff8b12012-04-13 09:12:31 +000030#include <thrift/protocol/TJSONProtocol.h>
31#include <thrift/transport/THttpClient.h>
32#include <thrift/transport/TTransportUtils.h>
33#include <thrift/transport/TSocket.h>
34#include <thrift/transport/TSSLSocket.h>
35#include <thrift/async/TEvhttpClientChannel.h>
36#include <thrift/server/TNonblockingServer.h> // <event.h>
Mark Sleee8540632006-05-30 09:24:40 +000037
Marc Slemko6be374b2006-08-04 03:16:25 +000038#include <boost/shared_ptr.hpp>
Roger Meierca142b02011-06-07 17:59:07 +000039#include <boost/program_options.hpp>
cdwijayarathnaa07ec0b2014-08-09 17:45:56 +053040#include <boost/filesystem.hpp>
Jake Farrell5d02b802014-01-07 21:42:01 -050041#include <thrift/cxxfunctional.h>
42#if _WIN32
Konrad Grochowski16a23a62014-11-13 15:33:38 +010043#include <thrift/windows/TWinsockSingleton.h>
Jake Farrell5d02b802014-01-07 21:42:01 -050044#endif
Roger Meierca142b02011-06-07 17:59:07 +000045
Marc Slemko6be374b2006-08-04 03:16:25 +000046#include "ThriftTest.h"
47
Marc Slemko6be374b2006-08-04 03:16:25 +000048using namespace std;
T Jake Lucianib5e62212009-01-31 22:36:20 +000049using namespace apache::thrift;
50using namespace apache::thrift::protocol;
51using namespace apache::thrift::transport;
Marc Slemkobf4fd192006-08-15 21:29:39 +000052using namespace thrift::test;
Roger Meier7e056e72011-07-17 07:28:28 +000053using namespace apache::thrift::async;
54
cdwijayarathnaa07ec0b2014-08-09 17:45:56 +053055// Length of argv[0] - Length of script dir
56#define EXECUTABLE_FILE_NAME_LENGTH 19
57
Mark Slee95771002006-06-07 06:53:25 +000058// Current time, microseconds since the epoch
Konrad Grochowski16a23a62014-11-13 15:33:38 +010059uint64_t now() {
Roger Meier5f9614c2010-11-21 16:59:05 +000060 int64_t ret;
Mark Slee95771002006-06-07 06:53:25 +000061 struct timeval tv;
David Reiss0c90f6f2008-02-06 22:18:40 +000062
Jake Farrell5d02b802014-01-07 21:42:01 -050063 THRIFT_GETTIMEOFDAY(&tv, NULL);
Mark Slee95771002006-06-07 06:53:25 +000064 ret = tv.tv_sec;
Konrad Grochowski16a23a62014-11-13 15:33:38 +010065 ret = ret * 1000 * 1000 + tv.tv_usec;
Mark Slee95771002006-06-07 06:53:25 +000066 return ret;
67}
68
Sebastian Zenker39e505c2015-12-18 16:15:08 +010069static void testString_clientReturn(event_base* base,
70 int testNr,
Konrad Grochowski16a23a62014-11-13 15:33:38 +010071 ThriftTestCobClient* client) {
Roger Meier7e056e72011-07-17 07:28:28 +000072 try {
73 string s;
74 client->recv_testString(s);
Sebastian Zenker39e505c2015-12-18 16:15:08 +010075 std::ostringstream os;
76 os << "test" << testNr;
77 const bool ok = (s == os.str());
78 cout << "testString: " << s << " " << ((ok) ? "ok" : "failed") << endl;
Roger Meier7e056e72011-07-17 07:28:28 +000079 } catch (TException& exn) {
Jake Farrell5d02b802014-01-07 21:42:01 -050080 cout << "Error: " << exn.what() << endl;
Roger Meier7e056e72011-07-17 07:28:28 +000081 }
82
Sebastian Zenker39e505c2015-12-18 16:15:08 +010083 if (testNr == 9)
84 event_base_loopbreak(base); // end test
Roger Meier7e056e72011-07-17 07:28:28 +000085}
86
Sebastian Zenker39e505c2015-12-18 16:15:08 +010087static void testVoid_clientReturn(event_base* base, ThriftTestCobClient* client) {
Roger Meier7e056e72011-07-17 07:28:28 +000088 try {
89 client->recv_testVoid();
90 cout << "testVoid" << endl;
91
Sebastian Zenker39e505c2015-12-18 16:15:08 +010092 for (int testNr = 0; testNr < 10; ++testNr) {
93 std::ostringstream os;
94 os << "test" << testNr;
95 client->testString(tcxx::bind(testString_clientReturn,
96 base,
97 testNr,
98 tcxx::placeholders::_1),
99 os.str());
100 }
Roger Meier7e056e72011-07-17 07:28:28 +0000101 } catch (TException& exn) {
Jake Farrell5d02b802014-01-07 21:42:01 -0500102 cout << "Error: " << exn.what() << endl;
Roger Meier7e056e72011-07-17 07:28:28 +0000103 }
104}
105
Nobuaki Sukegawa228b3282015-10-10 03:11:49 +0900106// Workaround for absense of C++11 "auto" keyword.
107template <typename T>
108bool print_eq(T expected, T actual) {
109 cout << "(" << actual << ")" << endl;
110 if (expected != actual) {
111 cout << "*** FAILED ***" << endl << "Expected: " << expected << " but got: " << actual << endl;
112 return false;
113 }
114 return true;
115}
116
117#define BASETYPE_IDENTITY_TEST(func, value) \
118 cout << #func "(" << value << ") = "; \
119 try { \
120 if (!print_eq(value, testClient.func(value))) \
121 return_code |= ERR_BASETYPES; \
122 } catch (TTransportException&) { \
123 throw; \
124 } catch (exception & ex) { \
125 cout << "*** FAILED ***" << endl << ex.what() << endl; \
126 return_code |= ERR_BASETYPES; \
127 }
128
Mark Sleee8540632006-05-30 09:24:40 +0000129int main(int argc, char** argv) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900130 cout.precision(19);
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900131 int ERR_BASETYPES = 1;
132 int ERR_STRUCTS = 2;
133 int ERR_CONTAINERS = 4;
134 int ERR_EXCEPTIONS = 8;
135 int ERR_UNKNOWN = 64;
136
cdwijayarathnaa07ec0b2014-08-09 17:45:56 +0530137 string file_path = boost::filesystem::system_complete(argv[0]).string();
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100138 string dir_path = file_path.substr(0, file_path.size() - EXECUTABLE_FILE_NAME_LENGTH);
Jake Farrell5d02b802014-01-07 21:42:01 -0500139#if _WIN32
140 transport::TWinsockSingleton::create();
141#endif
Mark Sleee8540632006-05-30 09:24:40 +0000142 string host = "localhost";
143 int port = 9090;
144 int numTests = 1;
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000145 bool ssl = false;
Roger Meierca142b02011-06-07 17:59:07 +0000146 string transport_type = "buffered";
147 string protocol_type = "binary";
148 string domain_socket = "";
pavlodd08f6e2015-10-08 16:43:56 -0400149 bool abstract_namespace = false;
Jens Geyerf4598682014-05-08 23:18:44 +0200150 bool noinsane = false;
Mark Sleee8540632006-05-30 09:24:40 +0000151
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900152 int return_code = 0;
153
Jake Farrell5d02b802014-01-07 21:42:01 -0500154 boost::program_options::options_description desc("Allowed options");
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100155 desc.add_options()("help,h",
156 "produce help message")("host",
157 boost::program_options::value<string>(&host)
158 ->default_value(host),
159 "Host to connect")("port",
160 boost::program_options::value<int>(
161 &port)->default_value(port),
162 "Port number to connect")(
163 "domain-socket",
164 boost::program_options::value<string>(&domain_socket)->default_value(domain_socket),
165 "Domain Socket (e.g. /tmp/ThriftTest.thrift), instead of host and port")(
pavlodd08f6e2015-10-08 16:43:56 -0400166 "abstract-namespace",
167 "Look for the domain socket in the Abstract Namespace (no connection with filesystem pathnames)")(
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100168 "transport",
169 boost::program_options::value<string>(&transport_type)->default_value(transport_type),
170 "Transport: buffered, framed, http, evhttp")(
171 "protocol",
172 boost::program_options::value<string>(&protocol_type)->default_value(protocol_type),
Dave Watson792db4e2015-01-16 11:22:01 -0800173 "Protocol: binary, header, compact, json")("ssl", "Encrypted Transport using SSL")(
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100174 "testloops,n",
175 boost::program_options::value<int>(&numTests)->default_value(numTests),
176 "Number of Tests")("noinsane", "Do not run insanity test");
Roger Meierca142b02011-06-07 17:59:07 +0000177
Jake Farrell5d02b802014-01-07 21:42:01 -0500178 boost::program_options::variables_map vm;
179 boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm);
180 boost::program_options::notify(vm);
Roger Meierca142b02011-06-07 17:59:07 +0000181
182 if (vm.count("help")) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900183 cout << desc << endl;
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900184 return ERR_UNKNOWN;
Mark Sleee8540632006-05-30 09:24:40 +0000185 }
Mark Sleea3302652006-10-25 19:03:32 +0000186
Jake Farrell5d02b802014-01-07 21:42:01 -0500187 try {
Roger Meierca142b02011-06-07 17:59:07 +0000188 if (!protocol_type.empty()) {
189 if (protocol_type == "binary") {
Roger Meier284101c2014-03-11 21:20:35 +0100190 } else if (protocol_type == "compact") {
Dave Watson792db4e2015-01-16 11:22:01 -0800191 } else if (protocol_type == "header") {
Roger Meierca142b02011-06-07 17:59:07 +0000192 } else if (protocol_type == "json") {
193 } else {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100194 throw invalid_argument("Unknown protocol type " + protocol_type);
Roger Meierca142b02011-06-07 17:59:07 +0000195 }
196 }
197
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100198 if (!transport_type.empty()) {
Roger Meierca142b02011-06-07 17:59:07 +0000199 if (transport_type == "buffered") {
200 } else if (transport_type == "framed") {
201 } else if (transport_type == "http") {
Roger Meier7e056e72011-07-17 07:28:28 +0000202 } else if (transport_type == "evhttp") {
Roger Meierca142b02011-06-07 17:59:07 +0000203 } else {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100204 throw invalid_argument("Unknown transport type " + transport_type);
Roger Meierca142b02011-06-07 17:59:07 +0000205 }
206 }
207
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900208 } catch (exception& e) {
Roger Meierca142b02011-06-07 17:59:07 +0000209 cerr << e.what() << endl;
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900210 cout << desc << endl;
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900211 return ERR_UNKNOWN;
Roger Meierca142b02011-06-07 17:59:07 +0000212 }
213
214 if (vm.count("ssl")) {
215 ssl = true;
216 }
cdwijayarathnaa07ec0b2014-08-09 17:45:56 +0530217
pavlodd08f6e2015-10-08 16:43:56 -0400218 if (vm.count("abstract-namespace")) {
219 abstract_namespace = true;
220 }
221
Jens Geyerf4598682014-05-08 23:18:44 +0200222 if (vm.count("noinsane")) {
223 noinsane = true;
224 }
Roger Meierca142b02011-06-07 17:59:07 +0000225
Roger Meier611f90c2011-12-11 22:08:51 +0000226 boost::shared_ptr<TTransport> transport;
227 boost::shared_ptr<TProtocol> protocol;
Roger Meierca142b02011-06-07 17:59:07 +0000228
Roger Meier611f90c2011-12-11 22:08:51 +0000229 boost::shared_ptr<TSocket> socket;
230 boost::shared_ptr<TSSLSocketFactory> factory;
Roger Meierca142b02011-06-07 17:59:07 +0000231
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000232 if (ssl) {
Roger Meier611f90c2011-12-11 22:08:51 +0000233 factory = boost::shared_ptr<TSSLSocketFactory>(new TSSLSocketFactory());
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000234 factory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
cdwijayarathnaa07ec0b2014-08-09 17:45:56 +0530235 factory->loadTrustedCertificates((dir_path + "../keys/CA.pem").c_str());
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000236 factory->authenticate(true);
237 socket = factory->createSocket(host, port);
238 } else {
Roger Meierca142b02011-06-07 17:59:07 +0000239 if (domain_socket != "") {
pavlodd08f6e2015-10-08 16:43:56 -0400240 if (abstract_namespace) {
241 std::string abstract_socket("\0", 1);
242 abstract_socket += domain_socket;
243 socket = boost::shared_ptr<TSocket>(new TSocket(abstract_socket));
244 } else {
245 socket = boost::shared_ptr<TSocket>(new TSocket(domain_socket));
246 }
Roger Meierca142b02011-06-07 17:59:07 +0000247 port = 0;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100248 } else {
Roger Meier611f90c2011-12-11 22:08:51 +0000249 socket = boost::shared_ptr<TSocket>(new TSocket(host, port));
Roger Meierca142b02011-06-07 17:59:07 +0000250 }
Bryan Duxburycd9aea12011-02-22 18:12:06 +0000251 }
Mark Sleea3302652006-10-25 19:03:32 +0000252
Roger Meierca142b02011-06-07 17:59:07 +0000253 if (transport_type.compare("http") == 0) {
Roger Meier611f90c2011-12-11 22:08:51 +0000254 boost::shared_ptr<TTransport> httpSocket(new THttpClient(socket, host, "/service"));
Roger Meierca142b02011-06-07 17:59:07 +0000255 transport = httpSocket;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100256 } else if (transport_type.compare("framed") == 0) {
Roger Meier611f90c2011-12-11 22:08:51 +0000257 boost::shared_ptr<TFramedTransport> framedSocket(new TFramedTransport(socket));
Mark Sleea3302652006-10-25 19:03:32 +0000258 transport = framedSocket;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100259 } else {
Roger Meier611f90c2011-12-11 22:08:51 +0000260 boost::shared_ptr<TBufferedTransport> bufferedSocket(new TBufferedTransport(socket));
Mark Sleea3302652006-10-25 19:03:32 +0000261 transport = bufferedSocket;
262 }
263
Roger Meierca142b02011-06-07 17:59:07 +0000264 if (protocol_type.compare("json") == 0) {
Roger Meier611f90c2011-12-11 22:08:51 +0000265 boost::shared_ptr<TProtocol> jsonProtocol(new TJSONProtocol(transport));
Roger Meierca142b02011-06-07 17:59:07 +0000266 protocol = jsonProtocol;
Roger Meier023192f2014-02-12 09:35:12 +0100267 } else if (protocol_type.compare("compact") == 0) {
268 boost::shared_ptr<TProtocol> compactProtocol(new TCompactProtocol(transport));
269 protocol = compactProtocol;
Dave Watson792db4e2015-01-16 11:22:01 -0800270 } else if (protocol_type == "header") {
271 boost::shared_ptr<TProtocol> headerProtocol(new THeaderProtocol(transport));
272 protocol = headerProtocol;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100273 } else {
Roger Meier611f90c2011-12-11 22:08:51 +0000274 boost::shared_ptr<TBinaryProtocol> binaryProtocol(new TBinaryProtocol(transport));
Roger Meierca142b02011-06-07 17:59:07 +0000275 protocol = binaryProtocol;
276 }
277
278 // Connection info
pavlodd08f6e2015-10-08 16:43:56 -0400279 cout << "Connecting (" << transport_type << "/" << protocol_type << ") to: ";
280 if (abstract_namespace) {
281 cout << '@';
282 }
283 cout << domain_socket;
Roger Meierca142b02011-06-07 17:59:07 +0000284 if (port != 0) {
285 cout << host << ":" << port;
286 }
287 cout << endl;
288
Roger Meier7e056e72011-07-17 07:28:28 +0000289 if (transport_type.compare("evhttp") == 0) {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100290 event_base* base = event_base_new();
Roger Meier7e056e72011-07-17 07:28:28 +0000291 cout << "Libevent Version: " << event_get_version() << endl;
292 cout << "Libevent Method: " << event_base_get_method(base) << endl;
293#if LIBEVENT_VERSION_NUMBER >= 0x02000000
294 cout << "Libevent Features: 0x" << hex << event_base_get_features(base) << endl;
295#endif
296
Roger Meier611f90c2011-12-11 22:08:51 +0000297 boost::shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
Roger Meier7e056e72011-07-17 07:28:28 +0000298
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100299 boost::shared_ptr<TAsyncChannel> channel(
300 new TEvhttpClientChannel(host.c_str(), "/", host.c_str(), port, base));
Roger Meier7e056e72011-07-17 07:28:28 +0000301 ThriftTestCobClient* client = new ThriftTestCobClient(channel, protocolFactory.get());
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100302 client->testVoid(tcxx::bind(testVoid_clientReturn,
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100303 base,
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100304 tcxx::placeholders::_1));
Jake Farrell5d02b802014-01-07 21:42:01 -0500305
Roger Meier7e056e72011-07-17 07:28:28 +0000306 event_base_loop(base, 0);
307 return 0;
308 }
309
Roger Meierca142b02011-06-07 17:59:07 +0000310 ThriftTestClient testClient(protocol);
Mark Sleed788b2e2006-09-07 01:26:35 +0000311
312 uint64_t time_min = 0;
313 uint64_t time_max = 0;
314 uint64_t time_tot = 0;
David Reiss0c90f6f2008-02-06 22:18:40 +0000315
Mark Sleee8540632006-05-30 09:24:40 +0000316 int test = 0;
317 for (test = 0; test < numTests; ++test) {
Mark Slee95771002006-06-07 06:53:25 +0000318
Mark Slee95771002006-06-07 06:53:25 +0000319 try {
Mark Sleea3302652006-10-25 19:03:32 +0000320 transport->open();
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900321 } catch (TTransportException& ex) {
322 cout << "Connect failed: " << ex.what() << endl;
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900323 return ERR_UNKNOWN;
Mark Sleee8540632006-05-30 09:24:40 +0000324 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000325
Mark Sleed788b2e2006-09-07 01:26:35 +0000326 /**
327 * CONNECT TEST
328 */
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100329 printf("Test #%d, connect %s:%d\n", test + 1, host.c_str(), port);
Mark Slee95771002006-06-07 06:53:25 +0000330
331 uint64_t start = now();
David Reiss0c90f6f2008-02-06 22:18:40 +0000332
Mark Sleee8540632006-05-30 09:24:40 +0000333 /**
334 * VOID TEST
335 */
Mark Sleee129a2d2007-02-21 05:17:48 +0000336 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900337 cout << "testVoid()" << flush;
Mark Sleee129a2d2007-02-21 05:17:48 +0000338 testClient.testVoid();
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900339 cout << " = void" << endl;
340 } catch (TTransportException&) {
341 // Stop here if transport got broken
342 throw;
343 } catch (exception& ex) {
344 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200345 return_code |= ERR_BASETYPES;
Mark Sleee129a2d2007-02-21 05:17:48 +0000346 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000347
Mark Sleee8540632006-05-30 09:24:40 +0000348 /**
349 * STRING TEST
350 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900351 cout << "testString(\"Test\")" << flush;
Mark Slee1921d202007-01-24 19:43:06 +0000352 string s;
353 testClient.testString(s, "Test");
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900354 cout << " = " << s << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200355 if (s != "Test") {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900356 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200357 return_code |= ERR_BASETYPES;
358 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000359
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900360 try {
361 string str(
362 "}{Afrikaans, Alemannisch, Aragonés, العربية, مصرى, "
363 "Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, "
364 "Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, "
365 "বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, "
366 "Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, "
367 "Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, "
368 "Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, "
369 "Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, "
370 "Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, "
371 "Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, "
372 "Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, "
373 "ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, "
374 "Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, "
375 "Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa "
376 "Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, مازِرونی, Bahasa "
377 "Melayu, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪"
378 "Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, "
379 "Occitan, Иронау, Papiamentu, Deitsch, Polski, پنجابی, پښتو, "
380 "Norfuk / Pitkern, Português, Runa Simi, Rumantsch, Romani, Română, "
381 "Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple "
382 "English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, "
383 "Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, "
384 "Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, "
385 "Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, "
386 "Bân-lâm-gú, 粵語");
387 cout << "testString(" << str << ") = " << flush;
388 testClient.testString(s, str);
389 cout << s << endl;
390 if (s != str) {
391 cout.imbue(locale("en_US.UTF8"));
392 cout << "*** FAILED ***" << endl << "Expected string: " << str << " but got: " << s << endl << "CLEAR";
393 return_code |= ERR_BASETYPES;
394 }
395 } catch (TTransportException&) {
396 throw;
397 } catch (exception& ex) {
398 cout << "*** FAILED ***" << endl << ex.what() << endl;
399 return_code |= ERR_BASETYPES;
400 return return_code;
401 }
402 try {
403 string str(
404 "quote: \" backslash:"
405 " forwardslash-escaped: \\/ "
406 " backspace: \b formfeed: \f newline: \n return: \r tab: "
407 " now-all-of-them-together: \"\\\\/\b\n\r\t"
408 " now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><"
409 " char-to-test-json-parsing: ]] \"]] \\\" }}}{ [[[ ");
410 cout << "testString(" << str << ") = " << flush;
411 testClient.testString(s, str);
412 cout << s << endl;
413 if (s != str) {
414 cout.imbue(locale("en_US.UTF8"));
415 cout << "*** FAILED ***" << endl
416 << "Expected string: " << str << " but got: " << s << endl
417 << "CLEAR";
418 ;
419 return_code |= ERR_BASETYPES;
420 }
421 } catch (TTransportException&) {
422 throw;
423 } catch (exception& ex) {
424 cout << "*** FAILED ***" << endl << ex.what() << endl;
425 return_code |= ERR_BASETYPES;
426 return return_code;
427 }
428
Mark Sleee8540632006-05-30 09:24:40 +0000429 /**
Nobuaki Sukegawaa649e742015-09-21 13:53:25 +0900430 * BOOL TEST
431 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900432 cout << boolalpha;
433 BASETYPE_IDENTITY_TEST(testBool, true);
434 BASETYPE_IDENTITY_TEST(testBool, false);
Nobuaki Sukegawaa649e742015-09-21 13:53:25 +0900435
436 /**
Mark Sleee8540632006-05-30 09:24:40 +0000437 * BYTE TEST
438 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900439 BASETYPE_IDENTITY_TEST(testByte, (int8_t)0);
440 BASETYPE_IDENTITY_TEST(testByte, (int8_t)-1);
441 BASETYPE_IDENTITY_TEST(testByte, (int8_t)42);
442 BASETYPE_IDENTITY_TEST(testByte, (int8_t)-42);
443 BASETYPE_IDENTITY_TEST(testByte, (int8_t)127);
444 BASETYPE_IDENTITY_TEST(testByte, (int8_t)-128);
David Reiss0c90f6f2008-02-06 22:18:40 +0000445
Mark Sleee8540632006-05-30 09:24:40 +0000446 /**
447 * I32 TEST
448 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900449 BASETYPE_IDENTITY_TEST(testI32, 0);
450 BASETYPE_IDENTITY_TEST(testI32, -1);
451 BASETYPE_IDENTITY_TEST(testI32, 190000013);
452 BASETYPE_IDENTITY_TEST(testI32, -190000013);
453 BASETYPE_IDENTITY_TEST(testI32, numeric_limits<int32_t>::max());
454 BASETYPE_IDENTITY_TEST(testI32, numeric_limits<int32_t>::min());
Mark Sleee8540632006-05-30 09:24:40 +0000455
456 /**
Mark Sleee8540632006-05-30 09:24:40 +0000457 * I64 TEST
458 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900459 BASETYPE_IDENTITY_TEST(testI64, (int64_t)0);
460 BASETYPE_IDENTITY_TEST(testI64, (int64_t)-1);
461 BASETYPE_IDENTITY_TEST(testI64, (int64_t)7000000000000000123LL);
462 BASETYPE_IDENTITY_TEST(testI64, (int64_t)-7000000000000000123LL);
463 BASETYPE_IDENTITY_TEST(testI64, (int64_t)pow(2LL, 32));
464 BASETYPE_IDENTITY_TEST(testI64, (int64_t)-pow(2LL, 32));
465 BASETYPE_IDENTITY_TEST(testI64, (int64_t)pow(2LL, 32) + 1);
466 BASETYPE_IDENTITY_TEST(testI64, (int64_t)-pow(2LL, 32) - 1);
467 BASETYPE_IDENTITY_TEST(testI64, numeric_limits<int64_t>::max());
468 BASETYPE_IDENTITY_TEST(testI64, numeric_limits<int64_t>::min());
Jens Geyer8bcfdd92014-12-14 03:14:26 +0100469
Mark Sleec98d0502006-09-06 02:42:25 +0000470 /**
471 * DOUBLE TEST
472 */
Nobuaki Sukegawa228b3282015-10-10 03:11:49 +0900473 // Comparing double values with plain equality because Thrift handles full precision of double
474 BASETYPE_IDENTITY_TEST(testDouble, 0.0);
475 BASETYPE_IDENTITY_TEST(testDouble, -1.0);
476 BASETYPE_IDENTITY_TEST(testDouble, -5.2098523);
477 BASETYPE_IDENTITY_TEST(testDouble, -0.000341012439638598279);
478 BASETYPE_IDENTITY_TEST(testDouble, pow(2, 32));
479 BASETYPE_IDENTITY_TEST(testDouble, pow(2, 32) + 1);
480 BASETYPE_IDENTITY_TEST(testDouble, pow(2, 53) - 1);
481 BASETYPE_IDENTITY_TEST(testDouble, -pow(2, 32));
482 BASETYPE_IDENTITY_TEST(testDouble, -pow(2, 32) - 1);
483 BASETYPE_IDENTITY_TEST(testDouble, -pow(2, 53) + 1);
484
485 try {
486 double expected = pow(10, 307);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900487 cout << "testDouble(" << expected << ") = " << flush;
Nobuaki Sukegawa228b3282015-10-10 03:11:49 +0900488 double actual = testClient.testDouble(expected);
489 cout << "(" << actual << ")" << endl;
490 if (expected - actual > pow(10, 292)) {
491 cout << "*** FAILED ***" << endl
492 << "Expected: " << expected << " but got: " << actual << endl;
493 }
494 } catch (TTransportException&) {
495 throw;
496 } catch (exception& ex) {
497 cout << "*** FAILED ***" << endl << ex.what() << endl;
498 return_code |= ERR_BASETYPES;
499 }
500
501 try {
502 double expected = pow(10, -292);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900503 cout << "testDouble(" << expected << ") = " << flush;
Nobuaki Sukegawa228b3282015-10-10 03:11:49 +0900504 double actual = testClient.testDouble(expected);
505 cout << "(" << actual << ")" << endl;
506 if (expected - actual > pow(10, -307)) {
507 cout << "*** FAILED ***" << endl
508 << "Expected: " << expected << " but got: " << actual << endl;
509 }
510 } catch (TTransportException&) {
511 throw;
512 } catch (exception& ex) {
513 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200514 return_code |= ERR_BASETYPES;
515 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000516
Mark Sleee8540632006-05-30 09:24:40 +0000517 /**
Jens Geyer8bcfdd92014-12-14 03:14:26 +0100518 * BINARY TEST
519 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900520 cout << "testBinary(empty)" << endl;
Nobuaki Sukegawadfb68962015-12-09 22:09:26 +0900521 try {
522 string bin_result;
523 testClient.testBinary(bin_result, string());
524 if (!bin_result.empty()) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900525 cout << endl << "*** FAILED ***" << endl;
526 cout << "invalid length: " << bin_result.size() << endl;
Nobuaki Sukegawadfb68962015-12-09 22:09:26 +0900527 return_code |= ERR_BASETYPES;
528 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900529 } catch (TTransportException&) {
530 throw;
Nobuaki Sukegawadfb68962015-12-09 22:09:26 +0900531 } catch (exception& ex) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900532 cout << "*** FAILED ***" << endl << ex.what() << endl;
Nobuaki Sukegawadfb68962015-12-09 22:09:26 +0900533 return_code |= ERR_BASETYPES;
534 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900535 cout << "testBinary([-128..127]) = {" << flush;
Jens Geyerd629ea02015-09-23 21:16:50 +0200536 const char bin_data[256]
537 = {-128, -127, -126, -125, -124, -123, -122, -121, -120, -119, -118, -117, -116, -115, -114,
538 -113, -112, -111, -110, -109, -108, -107, -106, -105, -104, -103, -102, -101, -100, -99,
539 -98, -97, -96, -95, -94, -93, -92, -91, -90, -89, -88, -87, -86, -85, -84,
540 -83, -82, -81, -80, -79, -78, -77, -76, -75, -74, -73, -72, -71, -70, -69,
541 -68, -67, -66, -65, -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54,
542 -53, -52, -51, -50, -49, -48, -47, -46, -45, -44, -43, -42, -41, -40, -39,
543 -38, -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, -26, -25, -24,
544 -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9,
545 -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6,
546 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
547 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
548 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
549 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
550 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
551 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
552 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
553 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
554 127};
555 try {
556 string bin_result;
557 testClient.testBinary(bin_result, string(bin_data, 256));
558 if (bin_result.size() != 256) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900559 cout << endl << "*** FAILED ***" << endl;
560 cout << "invalid length: " << bin_result.size() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200561 return_code |= ERR_BASETYPES;
562 } else {
563 bool first = true;
564 bool failed = false;
565 for (int i = 0; i < 256; ++i) {
566 if (!first)
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900567 cout << ",";
Jens Geyerd629ea02015-09-23 21:16:50 +0200568 else
569 first = false;
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900570 cout << static_cast<int>(bin_result[i]);
Jens Geyerd629ea02015-09-23 21:16:50 +0200571 if (!failed && bin_result[i] != i - 128) {
572 failed = true;
573 }
574 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900575 cout << "}" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200576 if (failed) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900577 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200578 return_code |= ERR_BASETYPES;
579 }
580 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900581 } catch (TTransportException&) {
582 throw;
Jens Geyerd629ea02015-09-23 21:16:50 +0200583 } catch (exception& ex) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900584 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200585 return_code |= ERR_BASETYPES;
586 }
587
Jens Geyer8bcfdd92014-12-14 03:14:26 +0100588
589 /**
Mark Sleee8540632006-05-30 09:24:40 +0000590 * STRUCT TEST
591 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900592 cout << "testStruct({\"Zero\", 1, -3, -5})" << flush;
Mark Sleee8540632006-05-30 09:24:40 +0000593 Xtruct out;
594 out.string_thing = "Zero";
595 out.byte_thing = 1;
Mark Sleee8540632006-05-30 09:24:40 +0000596 out.i32_thing = -3;
Mark Sleee8540632006-05-30 09:24:40 +0000597 out.i64_thing = -5;
Mark Slee1921d202007-01-24 19:43:06 +0000598 Xtruct in;
599 testClient.testStruct(in, out);
Roger Meier0e814802014-01-17 21:07:58 +0100600 printf(" = {\"%s\", %d, %d, %" PRId64 "}\n",
Mark Sleee8540632006-05-30 09:24:40 +0000601 in.string_thing.c_str(),
602 (int)in.byte_thing,
Mark Sleee8540632006-05-30 09:24:40 +0000603 in.i32_thing,
Mark Sleee8540632006-05-30 09:24:40 +0000604 in.i64_thing);
Jens Geyerd629ea02015-09-23 21:16:50 +0200605 if (in != out) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900606 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200607 return_code |= ERR_STRUCTS;
608 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000609
Mark Sleee8540632006-05-30 09:24:40 +0000610 /**
611 * NESTED STRUCT TEST
612 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900613 cout << "testNest({1, {\"Zero\", 1, -3, -5}), 5}" << flush;
Mark Sleee8540632006-05-30 09:24:40 +0000614 Xtruct2 out2;
615 out2.byte_thing = 1;
616 out2.struct_thing = out;
617 out2.i32_thing = 5;
Mark Slee1921d202007-01-24 19:43:06 +0000618 Xtruct2 in2;
619 testClient.testNest(in2, out2);
Mark Sleee8540632006-05-30 09:24:40 +0000620 in = in2.struct_thing;
Roger Meier0e814802014-01-17 21:07:58 +0100621 printf(" = {%d, {\"%s\", %d, %d, %" PRId64 "}, %d}\n",
Mark Sleee8540632006-05-30 09:24:40 +0000622 in2.byte_thing,
623 in.string_thing.c_str(),
624 (int)in.byte_thing,
Mark Sleee8540632006-05-30 09:24:40 +0000625 in.i32_thing,
Mark Sleee8540632006-05-30 09:24:40 +0000626 in.i64_thing,
David Reiss0c90f6f2008-02-06 22:18:40 +0000627 in2.i32_thing);
Jens Geyerd629ea02015-09-23 21:16:50 +0200628 if (in2 != out2) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900629 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200630 return_code |= ERR_STRUCTS;
631 }
Mark Sleee8540632006-05-30 09:24:40 +0000632
633 /**
634 * MAP TEST
635 */
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100636 map<int32_t, int32_t> mapout;
Mark Sleee8540632006-05-30 09:24:40 +0000637 for (int32_t i = 0; i < 5; ++i) {
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100638 mapout.insert(make_pair(i, i - 10));
Mark Sleee8540632006-05-30 09:24:40 +0000639 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900640 cout << "testMap({" << flush;
Mark Sleee8540632006-05-30 09:24:40 +0000641 map<int32_t, int32_t>::const_iterator m_iter;
642 bool first = true;
643 for (m_iter = mapout.begin(); m_iter != mapout.end(); ++m_iter) {
644 if (first) {
645 first = false;
646 } else {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900647 cout << ",";
Mark Sleee8540632006-05-30 09:24:40 +0000648 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900649 cout << m_iter->first << " => " << m_iter->second;
Mark Sleee8540632006-05-30 09:24:40 +0000650 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900651 cout << "})";
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100652 map<int32_t, int32_t> mapin;
Mark Slee1921d202007-01-24 19:43:06 +0000653 testClient.testMap(mapin, mapout);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900654 cout << " = {";
Mark Sleee8540632006-05-30 09:24:40 +0000655 first = true;
656 for (m_iter = mapin.begin(); m_iter != mapin.end(); ++m_iter) {
657 if (first) {
658 first = false;
659 } else {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900660 cout << ",";
Mark Sleee8540632006-05-30 09:24:40 +0000661 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900662 cout << m_iter->first << " => " << m_iter->second;
Mark Sleee8540632006-05-30 09:24:40 +0000663 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900664 cout << "}" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200665 if (mapin != mapout) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900666 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200667 return_code |= ERR_CONTAINERS;
668 }
Roger Meier4fce9602012-05-04 06:22:09 +0000669
670 /**
671 * STRING MAP TEST
Roger Meier4fce9602012-05-04 06:22:09 +0000672 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900673 cout << "testStringMap({a => 2, b => blah, some => thing}) = {" << flush;
Jens Geyerd629ea02015-09-23 21:16:50 +0200674 map<string, string> smapin;
675 map<string, string> smapout;
676 smapin["a"] = "2";
677 smapin["b"] = "blah";
678 smapin["some"] = "thing";
679 try {
680 testClient.testStringMap(smapout, smapin);
681 first = true;
682 for (map<string, string>::const_iterator it = smapout.begin(); it != smapout.end(); ++it) {
683 if (first)
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900684 cout << ",";
Jens Geyerd629ea02015-09-23 21:16:50 +0200685 else
686 first = false;
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900687 cout << it->first << " => " << it->second;
Jens Geyerd629ea02015-09-23 21:16:50 +0200688 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900689 cout << "}" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200690 if (smapin != smapout) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900691 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200692 return_code |= ERR_CONTAINERS;
693 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900694 } catch (TTransportException&) {
695 throw;
Jens Geyerd629ea02015-09-23 21:16:50 +0200696 } catch (exception& ex) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900697 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200698 return_code |= ERR_CONTAINERS;
699 }
Mark Sleee8540632006-05-30 09:24:40 +0000700
701 /**
702 * SET TEST
703 */
704 set<int32_t> setout;
705 for (int32_t i = -2; i < 3; ++i) {
706 setout.insert(i);
707 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900708 cout << "testSet({" << flush;
Mark Sleee8540632006-05-30 09:24:40 +0000709 set<int32_t>::const_iterator s_iter;
710 first = true;
711 for (s_iter = setout.begin(); s_iter != setout.end(); ++s_iter) {
712 if (first) {
713 first = false;
714 } else {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900715 cout << ",";
Mark Sleee8540632006-05-30 09:24:40 +0000716 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900717 cout << *s_iter;
Mark Sleee8540632006-05-30 09:24:40 +0000718 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900719 cout << "})";
Mark Slee1921d202007-01-24 19:43:06 +0000720 set<int32_t> setin;
721 testClient.testSet(setin, setout);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900722 cout << " = {";
Mark Sleee8540632006-05-30 09:24:40 +0000723 first = true;
724 for (s_iter = setin.begin(); s_iter != setin.end(); ++s_iter) {
725 if (first) {
726 first = false;
727 } else {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900728 cout << ",";
Mark Sleee8540632006-05-30 09:24:40 +0000729 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900730 cout << *s_iter;
Mark Sleee8540632006-05-30 09:24:40 +0000731 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900732 cout << "}" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200733 if (setin != setout) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900734 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200735 return_code |= ERR_CONTAINERS;
736 }
Mark Sleee8540632006-05-30 09:24:40 +0000737
738 /**
739 * LIST TEST
740 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900741 cout << "testList(empty)" << flush;
742 try {
743 vector<int32_t> listout;
744 testClient.testList(listout, vector<int32_t>());
745 if (!listout.empty()) {
746 cout << "*** FAILED ***" << endl;
747 cout << "invalid length: " << listout.size() << endl;
748 return_code |= ERR_CONTAINERS;
Mark Sleee8540632006-05-30 09:24:40 +0000749 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900750 } catch (TTransportException&) {
751 throw;
752 } catch (exception& ex) {
753 cout << "*** FAILED ***" << endl << ex.what() << endl;
754 return_code |= ERR_CONTAINERS;
Mark Sleee8540632006-05-30 09:24:40 +0000755 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900756 try {
757 vector<int32_t> listout;
758 for (int32_t i = -2; i < 3; ++i) {
759 listout.push_back(i);
Mark Sleee8540632006-05-30 09:24:40 +0000760 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900761 cout << "testList({" << flush;
762 vector<int32_t>::const_iterator l_iter;
763 first = true;
764 for (l_iter = listout.begin(); l_iter != listout.end(); ++l_iter) {
765 if (first) {
766 first = false;
767 } else {
768 cout << ",";
769 }
770 cout << *l_iter;
771 }
772 cout << "})";
773 vector<int32_t> listin;
774 testClient.testList(listin, listout);
775 cout << " = {";
776 first = true;
777 for (l_iter = listin.begin(); l_iter != listin.end(); ++l_iter) {
778 if (first) {
779 first = false;
780 } else {
781 cout << ",";
782 }
783 cout << *l_iter;
784 }
785 cout << "}" << endl;
786 if (listin != listout) {
787 cout << "*** FAILED ***" << endl;
788 return_code |= ERR_CONTAINERS;
789 }
790 } catch (TTransportException&) {
791 throw;
792 } catch (exception& ex) {
793 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200794 return_code |= ERR_CONTAINERS;
795 }
Mark Sleee8540632006-05-30 09:24:40 +0000796
797 /**
798 * ENUM TEST
799 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900800 cout << "testEnum(ONE)" << flush;
Bryan Duxbury833ae492010-09-27 17:26:02 +0000801 Numberz::type ret = testClient.testEnum(Numberz::ONE);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900802 cout << " = " << ret << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200803 if (ret != Numberz::ONE) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900804 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200805 return_code |= ERR_STRUCTS;
806 }
Mark Sleee8540632006-05-30 09:24:40 +0000807
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900808 cout << "testEnum(TWO)" << flush;
Bryan Duxbury833ae492010-09-27 17:26:02 +0000809 ret = testClient.testEnum(Numberz::TWO);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900810 cout << " = " << ret << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200811 if (ret != Numberz::TWO) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900812 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200813 return_code |= ERR_STRUCTS;
814 }
Mark Sleee8540632006-05-30 09:24:40 +0000815
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900816 cout << "testEnum(THREE)" << flush;
Bryan Duxbury833ae492010-09-27 17:26:02 +0000817 ret = testClient.testEnum(Numberz::THREE);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900818 cout << " = " << ret << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200819 if (ret != Numberz::THREE) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900820 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200821 return_code |= ERR_STRUCTS;
822 }
Mark Sleee8540632006-05-30 09:24:40 +0000823
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900824 cout << "testEnum(FIVE)" << flush;
Bryan Duxbury833ae492010-09-27 17:26:02 +0000825 ret = testClient.testEnum(Numberz::FIVE);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900826 cout << " = " << ret << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200827 if (ret != Numberz::FIVE) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900828 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200829 return_code |= ERR_STRUCTS;
830 }
Mark Sleee8540632006-05-30 09:24:40 +0000831
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900832 cout << "testEnum(EIGHT)" << flush;
Bryan Duxbury833ae492010-09-27 17:26:02 +0000833 ret = testClient.testEnum(Numberz::EIGHT);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900834 cout << " = " << ret << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200835 if (ret != Numberz::EIGHT) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900836 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200837 return_code |= ERR_STRUCTS;
838 }
Mark Sleee8540632006-05-30 09:24:40 +0000839
840 /**
841 * TYPEDEF TEST
842 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900843 cout << "testTypedef(309858235082523)" << flush;
Marc Slemkobf4fd192006-08-15 21:29:39 +0000844 UserId uid = testClient.testTypedef(309858235082523LL);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900845 cout << " = " << uid << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200846 if (uid != 309858235082523LL) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900847 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200848 return_code |= ERR_STRUCTS;
849 }
Mark Sleee8540632006-05-30 09:24:40 +0000850
851 /**
852 * NESTED MAP TEST
853 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900854 cout << "testMapMap(1)" << flush;
Mark Slee1921d202007-01-24 19:43:06 +0000855 map<int32_t, map<int32_t, int32_t> > mm;
856 testClient.testMapMap(mm, 1);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900857 cout << " = {";
Mark Sleee8540632006-05-30 09:24:40 +0000858 map<int32_t, map<int32_t, int32_t> >::const_iterator mi;
859 for (mi = mm.begin(); mi != mm.end(); ++mi) {
860 printf("%d => {", mi->first);
861 map<int32_t, int32_t>::const_iterator mi2;
862 for (mi2 = mi->second.begin(); mi2 != mi->second.end(); ++mi2) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900863 cout << mi2->first << " => " << mi2->second;
Mark Sleee8540632006-05-30 09:24:40 +0000864 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900865 cout << "}, ";
Mark Sleee8540632006-05-30 09:24:40 +0000866 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900867 cout << "}" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200868 if (mm.size() != 2 ||
869 mm[-4][-4] != -4 ||
870 mm[-4][-3] != -3 ||
871 mm[-4][-2] != -2 ||
872 mm[-4][-1] != -1 ||
873 mm[4][4] != 4 ||
874 mm[4][3] != 3 ||
875 mm[4][2] != 2 ||
876 mm[4][1] != 1) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900877 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200878 return_code |= ERR_CONTAINERS;
879 }
Mark Sleee8540632006-05-30 09:24:40 +0000880
881 /**
882 * INSANITY TEST
883 */
Jens Geyerf4598682014-05-08 23:18:44 +0200884 if (!noinsane) {
885 Insanity insane;
Jens Geyerd629ea02015-09-23 21:16:50 +0200886 insane.userMap.insert(make_pair(Numberz::FIVE, 5));
887 insane.userMap.insert(make_pair(Numberz::EIGHT, 8));
Jens Geyerf4598682014-05-08 23:18:44 +0200888 Xtruct truck;
Jens Geyerd629ea02015-09-23 21:16:50 +0200889 truck.string_thing = "Goodbye4";
890 truck.byte_thing = 4;
891 truck.i32_thing = 4;
892 truck.i64_thing = 4;
893 Xtruct truck2;
894 truck2.string_thing = "Hello2";
895 truck2.byte_thing = 2;
896 truck2.i32_thing = 2;
897 truck2.i64_thing = 2;
Jens Geyerf4598682014-05-08 23:18:44 +0200898 insane.xtructs.push_back(truck);
Jens Geyerd629ea02015-09-23 21:16:50 +0200899 insane.xtructs.push_back(truck2);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900900 cout << "testInsanity()" << flush;
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100901 map<UserId, map<Numberz::type, Insanity> > whoa;
Jens Geyerf4598682014-05-08 23:18:44 +0200902 testClient.testInsanity(whoa, insane);
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900903 cout << " = {";
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100904 map<UserId, map<Numberz::type, Insanity> >::const_iterator i_iter;
Jens Geyerf4598682014-05-08 23:18:44 +0200905 for (i_iter = whoa.begin(); i_iter != whoa.end(); ++i_iter) {
906 printf("%" PRId64 " => {", i_iter->first);
Konrad Grochowski16a23a62014-11-13 15:33:38 +0100907 map<Numberz::type, Insanity>::const_iterator i2_iter;
908 for (i2_iter = i_iter->second.begin(); i2_iter != i_iter->second.end(); ++i2_iter) {
Jens Geyerf4598682014-05-08 23:18:44 +0200909 printf("%d => {", i2_iter->first);
910 map<Numberz::type, UserId> userMap = i2_iter->second.userMap;
911 map<Numberz::type, UserId>::const_iterator um;
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900912 cout << "{";
Jens Geyerf4598682014-05-08 23:18:44 +0200913 for (um = userMap.begin(); um != userMap.end(); ++um) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900914 cout << um->first << " => " << um->second;
Jens Geyerf4598682014-05-08 23:18:44 +0200915 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900916 cout << "}, ";
Mark Sleee8540632006-05-30 09:24:40 +0000917
Jens Geyerf4598682014-05-08 23:18:44 +0200918 vector<Xtruct> xtructs = i2_iter->second.xtructs;
919 vector<Xtruct>::const_iterator x;
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900920 cout << "{";
Jens Geyerf4598682014-05-08 23:18:44 +0200921 for (x = xtructs.begin(); x != xtructs.end(); ++x) {
922 printf("{\"%s\", %d, %d, %" PRId64 "}, ",
923 x->string_thing.c_str(),
924 (int)x->byte_thing,
925 x->i32_thing,
926 x->i64_thing);
927 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900928 cout << "}";
Mark Sleee8540632006-05-30 09:24:40 +0000929
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900930 cout << "}, ";
Jens Geyerf4598682014-05-08 23:18:44 +0200931 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900932 cout << "}, ";
Mark Sleee8540632006-05-30 09:24:40 +0000933 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900934 cout << "}" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200935 bool failed = false;
936 map<UserId, map<Numberz::type, Insanity> >::const_iterator it1 = whoa.find(UserId(1));
937 if (whoa.size() != 2) {
938 failed = true;
939 }
940 if (it1 == whoa.end()) {
941 failed = true;
942 } else {
943 map<Numberz::type, Insanity>::const_iterator it12 = it1->second.find(Numberz::TWO);
944 if (it12 == it1->second.end() || it12->second != insane) {
945 failed = true;
946 }
947 map<Numberz::type, Insanity>::const_iterator it13 = it1->second.find(Numberz::THREE);
948 if (it13 == it1->second.end() || it13->second != insane) {
949 failed = true;
950 }
951 }
952 map<UserId, map<Numberz::type, Insanity> >::const_iterator it2 = whoa.find(UserId(2));
953 if (it2 == whoa.end()) {
954 failed = true;
955 } else {
956 map<Numberz::type, Insanity>::const_iterator it26 = it2->second.find(Numberz::SIX);
957 if (it26 == it1->second.end() || it26->second != Insanity()) {
958 failed = true;
959 }
960 }
961 if (failed) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900962 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200963 return_code |= ERR_STRUCTS;
964 }
Mark Sleee8540632006-05-30 09:24:40 +0000965 }
Jens Geyerd629ea02015-09-23 21:16:50 +0200966
967 /**
968 * MULTI TEST
969 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900970 cout << "testMulti()" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200971 try {
972 map<int16_t, string> mul_map;
973 Xtruct mul_result;
974 mul_map[1] = "blah";
975 mul_map[2] = "thing";
976 testClient.testMulti(mul_result, 42, 4242, 424242, mul_map, Numberz::EIGHT, UserId(24));
977 Xtruct xxs;
978 xxs.string_thing = "Hello2";
979 xxs.byte_thing = 42;
980 xxs.i32_thing = 4242;
981 xxs.i64_thing = 424242;
982 if (mul_result != xxs) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900983 cout << "*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200984 return_code |= ERR_STRUCTS;
985 }
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900986 } catch (TTransportException&) {
987 throw;
Jens Geyerd629ea02015-09-23 21:16:50 +0200988 } catch (exception& ex) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900989 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200990 return_code |= ERR_STRUCTS;
991 }
992
Marc Slemko71d4e472006-08-15 22:34:04 +0000993 /* test exception */
Mark Slee95771002006-06-07 06:53:25 +0000994
Marc Slemkobf4fd192006-08-15 21:29:39 +0000995 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900996 cout << "testClient.testException(\"Xception\") =>" << flush;
Marc Slemko71d4e472006-08-15 22:34:04 +0000997 testClient.testException("Xception");
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +0900998 cout << " void\n*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +0200999 return_code |= ERR_EXCEPTIONS;
David Reiss0c90f6f2008-02-06 22:18:40 +00001000
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001001 } catch (Xception& e) {
Marc Slemko71d4e472006-08-15 22:34:04 +00001002 printf(" {%u, \"%s\"}\n", e.errorCode, e.message.c_str());
Marc Slemkobf4fd192006-08-15 21:29:39 +00001003 }
David Reiss0c90f6f2008-02-06 22:18:40 +00001004
Marc Slemkobf4fd192006-08-15 21:29:39 +00001005 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001006 cout << "testClient.testException(\"TException\") =>" << flush;
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001007 testClient.testException("TException");
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001008 cout << " void\n*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001009 return_code |= ERR_EXCEPTIONS;
Roger Meierf50df7f2012-05-02 22:49:55 +00001010
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001011 } catch (const TException&) {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001012 cout << " Caught TException" << endl;
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001013 }
Roger Meierf50df7f2012-05-02 22:49:55 +00001014
1015 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001016 cout << "testClient.testException(\"success\") =>" << flush;
Marc Slemko71d4e472006-08-15 22:34:04 +00001017 testClient.testException("success");
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001018 cout << " void" << endl;
1019 } catch (exception & ex) { \
1020 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001021 return_code |= ERR_EXCEPTIONS;
Marc Slemko71d4e472006-08-15 22:34:04 +00001022 }
David Reiss0c90f6f2008-02-06 22:18:40 +00001023
Marc Slemko71d4e472006-08-15 22:34:04 +00001024 /* test multi exception */
David Reiss0c90f6f2008-02-06 22:18:40 +00001025
Marc Slemko71d4e472006-08-15 22:34:04 +00001026 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001027 cout << "testClient.testMultiException(\"Xception\", \"test 1\") =>" << flush;
Mark Slee1921d202007-01-24 19:43:06 +00001028 Xtruct result;
1029 testClient.testMultiException(result, "Xception", "test 1");
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001030 cout << " result\n*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001031 return_code |= ERR_EXCEPTIONS;
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001032 } catch (Xception& e) {
Marc Slemko71d4e472006-08-15 22:34:04 +00001033 printf(" {%u, \"%s\"}\n", e.errorCode, e.message.c_str());
1034 }
1035
1036 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001037 cout << "testClient.testMultiException(\"Xception2\", \"test 2\") =>" << flush;
Mark Slee1921d202007-01-24 19:43:06 +00001038 Xtruct result;
1039 testClient.testMultiException(result, "Xception2", "test 2");
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001040 cout << " result\n*** FAILED ***" << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001041 return_code |= ERR_EXCEPTIONS;
David Reiss0c90f6f2008-02-06 22:18:40 +00001042
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001043 } catch (Xception2& e) {
Marc Slemko71d4e472006-08-15 22:34:04 +00001044 printf(" {%u, {\"%s\"}}\n", e.errorCode, e.struct_thing.string_thing.c_str());
Marc Slemkobf4fd192006-08-15 21:29:39 +00001045 }
David Reiss0c90f6f2008-02-06 22:18:40 +00001046
Marc Slemko71d4e472006-08-15 22:34:04 +00001047 try {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001048 cout << "testClient.testMultiException(\"success\", \"test 3\") =>" << flush;
Mark Slee1921d202007-01-24 19:43:06 +00001049 Xtruct result;
1050 testClient.testMultiException(result, "success", "test 3");
Marc Slemko71d4e472006-08-15 22:34:04 +00001051 printf(" {{\"%s\"}}\n", result.string_thing.c_str());
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001052 } catch (exception & ex) { \
1053 cout << "*** FAILED ***" << endl << ex.what() << endl;
Jens Geyerd629ea02015-09-23 21:16:50 +02001054 return_code |= ERR_EXCEPTIONS;
Marc Slemko71d4e472006-08-15 22:34:04 +00001055 }
David Reiss0c90f6f2008-02-06 22:18:40 +00001056
David Reissc51986f2009-03-24 20:01:25 +00001057 /* test oneway void */
David Reiss2ab6fe82008-02-18 02:11:44 +00001058 {
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001059 cout << "testClient.testOneway(1) =>" << flush;
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001060 uint64_t startOneway = now();
1061 testClient.testOneway(1);
1062 uint64_t elapsed = now() - startOneway;
1063 if (elapsed > 200 * 1000) { // 0.2 seconds
Jens Geyerd629ea02015-09-23 21:16:50 +02001064 printf("*** FAILED *** - took %.2f ms\n", (double)elapsed / 1000.0);
1065 return_code |= ERR_BASETYPES;
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001066 } else {
1067 printf(" success - took %.2f ms\n", (double)elapsed / 1000.0);
1068 }
David Reiss2ab6fe82008-02-18 02:11:44 +00001069 }
1070
David Reiss2845b522008-02-18 02:11:52 +00001071 /**
David Reissc51986f2009-03-24 20:01:25 +00001072 * redo a simple test after the oneway to make sure we aren't "off by one" --
1073 * if the server treated oneway void like normal void, this next test will
David Reiss2845b522008-02-18 02:11:52 +00001074 * fail since it will get the void confirmation rather than the correct
1075 * result. In this circumstance, the client will throw the exception:
1076 *
1077 * TApplicationException: Wrong method namea
1078 */
1079 /**
1080 * I32 TEST
1081 */
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001082 cout << "re-test testI32(-1)";
1083 int i32 = testClient.testI32(-1);
1084 cout << " = " << i32 << endl;
Roger Meier4fce9602012-05-04 06:22:09 +00001085 if (i32 != -1)
Jens Geyerd629ea02015-09-23 21:16:50 +02001086 return_code |= ERR_BASETYPES;
David Reiss2845b522008-02-18 02:11:52 +00001087
Marc Slemkobf4fd192006-08-15 21:29:39 +00001088 uint64_t stop = now();
Konrad Grochowski16a23a62014-11-13 15:33:38 +01001089 uint64_t tot = stop - start;
Mark Sleed788b2e2006-09-07 01:26:35 +00001090
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001091 cout << "Total time: " << stop - start << " us" << endl;
David Reiss0c90f6f2008-02-06 22:18:40 +00001092
Mark Sleed788b2e2006-09-07 01:26:35 +00001093 time_tot += tot;
1094 if (time_min == 0 || tot < time_min) {
1095 time_min = tot;
1096 }
1097 if (tot > time_max) {
1098 time_max = tot;
1099 }
1100
Mark Sleea3302652006-10-25 19:03:32 +00001101 transport->close();
Mark Sleee8540632006-05-30 09:24:40 +00001102 }
1103
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001104 cout << endl << "All tests done." << endl;
Mark Sleed788b2e2006-09-07 01:26:35 +00001105
1106 uint64_t time_avg = time_tot / numTests;
1107
Nobuaki Sukegawa9b35a7c2015-11-17 11:01:41 +09001108 cout << "Min time: " << time_min << " us" << endl;
1109 cout << "Max time: " << time_max << " us" << endl;
1110 cout << "Avg time: " << time_avg << " us" << endl;
Mark Sleed788b2e2006-09-07 01:26:35 +00001111
Jens Geyerd629ea02015-09-23 21:16:50 +02001112 return return_code;
Mark Sleee8540632006-05-30 09:24:40 +00001113}