blob: bc76e830e03f11c66e3d7c23289fe5c57c60ee20 [file] [log] [blame]
Mark Slee95771002006-06-07 06:53:25 +00001package com.facebook.thrift.test;
2
Mark Slee78f58e22006-09-02 04:17:07 +00003// Generated code
4import thrift.test.*;
5
Mark Sleee129a2d2007-02-21 05:17:48 +00006import com.facebook.thrift.TApplicationException;
Mark Slee844ac122007-11-27 08:38:52 +00007import com.facebook.thrift.TSerializer;
Mark Sleeb9acf982006-10-10 01:57:32 +00008import com.facebook.thrift.transport.TTransport;
Mark Slee95771002006-06-07 06:53:25 +00009import com.facebook.thrift.transport.TSocket;
Mark Sleeb9acf982006-10-10 01:57:32 +000010import com.facebook.thrift.transport.THttpClient;
Mark Sleea3302652006-10-25 19:03:32 +000011import com.facebook.thrift.transport.TFramedTransport;
Mark Slee95771002006-06-07 06:53:25 +000012import com.facebook.thrift.transport.TTransportException;
13import com.facebook.thrift.protocol.TBinaryProtocol;
David Reiss4f15f592008-02-23 22:07:43 +000014import com.facebook.thrift.protocol.TSimpleJSONProtocol;
Mark Slee95771002006-06-07 06:53:25 +000015
Mark Slee22360b22008-02-09 00:18:32 +000016import java.util.Map;
Mark Slee95771002006-06-07 06:53:25 +000017import java.util.HashMap;
Mark Slee22360b22008-02-09 00:18:32 +000018import java.util.Set;
Mark Slee95771002006-06-07 06:53:25 +000019import java.util.HashSet;
Mark Slee22360b22008-02-09 00:18:32 +000020import java.util.List;
Mark Slee95771002006-06-07 06:53:25 +000021import java.util.ArrayList;
22
23/**
24 * Test Java client for thrift. Essentially just a copy of the C++ version,
25 * this makes a variety of requests to enable testing for both performance and
26 * correctness of the output.
27 *
28 * @author Mark Slee <mcslee@facebook.com>
29 */
30public class TestClient {
31 public static void main(String [] args) {
32 try {
33 String host = "localhost";
34 int port = 9090;
Mark Sleeb9acf982006-10-10 01:57:32 +000035 String url = null;
Mark Slee95771002006-06-07 06:53:25 +000036 int numTests = 1;
Mark Sleea3302652006-10-25 19:03:32 +000037 boolean framed = false;
38 boolean framedInput = true;
39 boolean framedOutput = true;
Mark Sleeb9acf982006-10-10 01:57:32 +000040
David Reiss03b574f2008-07-02 23:55:04 +000041 int socketTimeout = 1000;
42
Mark Sleeb9acf982006-10-10 01:57:32 +000043 try {
44 for (int i = 0; i < args.length; ++i) {
45 if (args[i].equals("-h")) {
Mark Sleea3302652006-10-25 19:03:32 +000046 String[] hostport = (args[++i]).split(":");
Mark Sleeb9acf982006-10-10 01:57:32 +000047 host = hostport[0];
Mark Slee844ac122007-11-27 08:38:52 +000048 port = Integer.valueOf(hostport[1]);
Mark Sleea3302652006-10-25 19:03:32 +000049 } else if (args[i].equals("-f") || args[i].equals("-framed")) {
50 framed = true;
51 } else if (args[i].equals("-fo")) {
52 framed = true;
53 framedInput = false;
54 } else if (args[i].equals("-u")) {
Mark Sleeb9acf982006-10-10 01:57:32 +000055 url = args[++i];
Mark Sleea3302652006-10-25 19:03:32 +000056 } else if (args[i].equals("-n")) {
Mark Sleeb9acf982006-10-10 01:57:32 +000057 numTests = Integer.valueOf(args[++i]);
David Reiss03b574f2008-07-02 23:55:04 +000058 } else if (args[i].equals("-timeout")) {
59 socketTimeout = Integer.valueOf(args[++i]);
Mark Sleeb9acf982006-10-10 01:57:32 +000060 }
61 }
62 } catch (Exception x) {
63 x.printStackTrace();
Mark Slee95771002006-06-07 06:53:25 +000064 }
Mark Slee844ac122007-11-27 08:38:52 +000065
Mark Sleeb9acf982006-10-10 01:57:32 +000066 TTransport transport;
Mark Slee844ac122007-11-27 08:38:52 +000067
Mark Sleeb9acf982006-10-10 01:57:32 +000068 if (url != null) {
69 transport = new THttpClient(url);
70 } else {
Mark Sleea3302652006-10-25 19:03:32 +000071 TSocket socket = new TSocket(host, port);
David Reiss03b574f2008-07-02 23:55:04 +000072 socket.setTimeout(socketTimeout);
Mark Sleea3302652006-10-25 19:03:32 +000073 transport = socket;
74 if (framed) {
75 transport = new TFramedTransport(transport,
76 framedInput,
77 framedOutput);
78 }
Mark Sleeb9acf982006-10-10 01:57:32 +000079 }
80
Mark Slee95771002006-06-07 06:53:25 +000081 TBinaryProtocol binaryProtocol =
Mark Slee7dafc942007-08-09 03:40:15 +000082 new TBinaryProtocol(transport);
Mark Slee78f58e22006-09-02 04:17:07 +000083 ThriftTest.Client testClient =
Mark Slee1dd819c2006-10-26 04:56:18 +000084 new ThriftTest.Client(binaryProtocol);
Mark Slee844ac122007-11-27 08:38:52 +000085 Insanity insane = new Insanity();
Mark Slee95771002006-06-07 06:53:25 +000086
Mark Sleed788b2e2006-09-07 01:26:35 +000087 long timeMin = 0;
88 long timeMax = 0;
89 long timeTot = 0;
90
Mark Slee95771002006-06-07 06:53:25 +000091 for (int test = 0; test < numTests; ++test) {
92
93 /**
94 * CONNECT TEST
95 */
Mark Sleed788b2e2006-09-07 01:26:35 +000096 System.out.println("Test #" + (test+1) + ", " + "connect " + host + ":" + port);
Mark Slee95771002006-06-07 06:53:25 +000097 try {
Mark Sleeb9acf982006-10-10 01:57:32 +000098 transport.open();
Mark Slee95771002006-06-07 06:53:25 +000099 } catch (TTransportException ttx) {
100 System.out.println("Connect failed: " + ttx.getMessage());
101 continue;
102 }
103
Mark Sleed788b2e2006-09-07 01:26:35 +0000104 long start = System.nanoTime();
Mark Slee844ac122007-11-27 08:38:52 +0000105
Mark Slee95771002006-06-07 06:53:25 +0000106 /**
107 * VOID TEST
108 */
Mark Sleee129a2d2007-02-21 05:17:48 +0000109 try {
110 System.out.print("testVoid()");
111 testClient.testVoid();
112 System.out.print(" = void\n");
113 } catch (TApplicationException tax) {
114 tax.printStackTrace();
115 }
Mark Slee95771002006-06-07 06:53:25 +0000116
117 /**
118 * STRING TEST
119 */
120 System.out.print("testString(\"Test\")");
Mark Slee78f58e22006-09-02 04:17:07 +0000121 String s = testClient.testString("Test");
122 System.out.print(" = \"" + s + "\"\n");
123
Mark Slee95771002006-06-07 06:53:25 +0000124 /**
125 * BYTE TEST
126 */
127 System.out.print("testByte(1)");
Mark Slee78f58e22006-09-02 04:17:07 +0000128 byte i8 = testClient.testByte((byte)1);
129 System.out.print(" = " + i8 + "\n");
Mark Slee844ac122007-11-27 08:38:52 +0000130
Mark Slee95771002006-06-07 06:53:25 +0000131 /**
132 * I32 TEST
133 */
134 System.out.print("testI32(-1)");
Mark Slee78f58e22006-09-02 04:17:07 +0000135 int i32 = testClient.testI32(-1);
136 System.out.print(" = " + i32 + "\n");
Mark Slee95771002006-06-07 06:53:25 +0000137
138 /**
Mark Slee95771002006-06-07 06:53:25 +0000139 * I64 TEST
140 */
141 System.out.print("testI64(-34359738368)");
Mark Slee78f58e22006-09-02 04:17:07 +0000142 long i64 = testClient.testI64(-34359738368L);
143 System.out.print(" = " + i64 + "\n");
Mark Slee95771002006-06-07 06:53:25 +0000144
145 /**
Mark Sleec98d0502006-09-06 02:42:25 +0000146 * DOUBLE TEST
147 */
148 System.out.print("testDouble(5.325098235)");
149 double dub = testClient.testDouble(5.325098235);
150 System.out.print(" = " + dub + "\n");
151
152 /**
Mark Slee95771002006-06-07 06:53:25 +0000153 * STRUCT TEST
154 */
Mark Slee6e536442006-06-30 18:28:50 +0000155 System.out.print("testStruct({\"Zero\", 1, -3, -5})");
Mark Slee95771002006-06-07 06:53:25 +0000156 Xtruct out = new Xtruct();
Mark Slee78f58e22006-09-02 04:17:07 +0000157 out.string_thing = "Zero";
158 out.byte_thing = (byte) 1;
159 out.i32_thing = -3;
160 out.i64_thing = -5;
Mark Slee95771002006-06-07 06:53:25 +0000161 Xtruct in = testClient.testStruct(out);
Mark Sleed788b2e2006-09-07 01:26:35 +0000162 System.out.print(" = {" + "\"" + in.string_thing + "\", " + in.byte_thing + ", " + in.i32_thing + ", " + in.i64_thing + "}\n");
Mark Slee95771002006-06-07 06:53:25 +0000163
164 /**
165 * NESTED STRUCT TEST
166 */
Mark Slee6e536442006-06-30 18:28:50 +0000167 System.out.print("testNest({1, {\"Zero\", 1, -3, -5}), 5}");
Mark Slee95771002006-06-07 06:53:25 +0000168 Xtruct2 out2 = new Xtruct2();
Mark Slee78f58e22006-09-02 04:17:07 +0000169 out2.byte_thing = (short)1;
Mark Slee95771002006-06-07 06:53:25 +0000170 out2.struct_thing = out;
Mark Slee78f58e22006-09-02 04:17:07 +0000171 out2.i32_thing = 5;
Mark Slee95771002006-06-07 06:53:25 +0000172 Xtruct2 in2 = testClient.testNest(out2);
173 in = in2.struct_thing;
Mark Sleed788b2e2006-09-07 01:26:35 +0000174 System.out.print(" = {" + in2.byte_thing + ", {" + "\"" + in.string_thing + "\", " + in.byte_thing + ", " + in.i32_thing + ", " + in.i64_thing + "}, " + in2.i32_thing + "}\n");
Mark Slee95771002006-06-07 06:53:25 +0000175
176 /**
177 * MAP TEST
178 */
Mark Slee22360b22008-02-09 00:18:32 +0000179 Map<Integer,Integer> mapout = new HashMap<Integer,Integer>();
Mark Slee95771002006-06-07 06:53:25 +0000180 for (int i = 0; i < 5; ++i) {
Mark Slee78f58e22006-09-02 04:17:07 +0000181 mapout.put(i, i-10);
Mark Slee95771002006-06-07 06:53:25 +0000182 }
183 System.out.print("testMap({");
184 boolean first = true;
Mark Slee78f58e22006-09-02 04:17:07 +0000185 for (int key : mapout.keySet()) {
Mark Slee95771002006-06-07 06:53:25 +0000186 if (first) {
187 first = false;
188 } else {
189 System.out.print(", ");
190 }
Mark Slee78f58e22006-09-02 04:17:07 +0000191 System.out.print(key + " => " + mapout.get(key));
Mark Slee95771002006-06-07 06:53:25 +0000192 }
193 System.out.print("})");
Mark Slee22360b22008-02-09 00:18:32 +0000194 Map<Integer,Integer> mapin = testClient.testMap(mapout);
Mark Slee95771002006-06-07 06:53:25 +0000195 System.out.print(" = {");
196 first = true;
Mark Slee78f58e22006-09-02 04:17:07 +0000197 for (int key : mapin.keySet()) {
Mark Slee95771002006-06-07 06:53:25 +0000198 if (first) {
199 first = false;
200 } else {
201 System.out.print(", ");
202 }
Mark Slee78f58e22006-09-02 04:17:07 +0000203 System.out.print(key + " => " + mapout.get(key));
Mark Slee95771002006-06-07 06:53:25 +0000204 }
205 System.out.print("}\n");
206
207 /**
208 * SET TEST
209 */
Mark Slee22360b22008-02-09 00:18:32 +0000210 Set<Integer> setout = new HashSet<Integer>();
Mark Slee95771002006-06-07 06:53:25 +0000211 for (int i = -2; i < 3; ++i) {
Mark Slee78f58e22006-09-02 04:17:07 +0000212 setout.add(i);
Mark Slee95771002006-06-07 06:53:25 +0000213 }
214 System.out.print("testSet({");
215 first = true;
Mark Slee78f58e22006-09-02 04:17:07 +0000216 for (int elem : setout) {
Mark Slee95771002006-06-07 06:53:25 +0000217 if (first) {
218 first = false;
219 } else {
220 System.out.print(", ");
221 }
Mark Slee78f58e22006-09-02 04:17:07 +0000222 System.out.print(elem);
Mark Slee95771002006-06-07 06:53:25 +0000223 }
224 System.out.print("})");
Mark Slee22360b22008-02-09 00:18:32 +0000225 Set<Integer> setin = testClient.testSet(setout);
Mark Slee95771002006-06-07 06:53:25 +0000226 System.out.print(" = {");
227 first = true;
Mark Slee78f58e22006-09-02 04:17:07 +0000228 for (int elem : setin) {
Mark Slee95771002006-06-07 06:53:25 +0000229 if (first) {
230 first = false;
231 } else {
232 System.out.print(", ");
233 }
Mark Slee78f58e22006-09-02 04:17:07 +0000234 System.out.print(elem);
Mark Slee95771002006-06-07 06:53:25 +0000235 }
236 System.out.print("}\n");
237
238 /**
239 * LIST TEST
240 */
Mark Slee22360b22008-02-09 00:18:32 +0000241 List<Integer> listout = new ArrayList<Integer>();
Mark Slee95771002006-06-07 06:53:25 +0000242 for (int i = -2; i < 3; ++i) {
Mark Slee78f58e22006-09-02 04:17:07 +0000243 listout.add(i);
Mark Slee95771002006-06-07 06:53:25 +0000244 }
245 System.out.print("testList({");
246 first = true;
Mark Slee78f58e22006-09-02 04:17:07 +0000247 for (int elem : listout) {
Mark Slee95771002006-06-07 06:53:25 +0000248 if (first) {
249 first = false;
250 } else {
251 System.out.print(", ");
252 }
Mark Slee78f58e22006-09-02 04:17:07 +0000253 System.out.print(elem);
Mark Slee95771002006-06-07 06:53:25 +0000254 }
255 System.out.print("})");
Mark Slee22360b22008-02-09 00:18:32 +0000256 List<Integer> listin = testClient.testList(listout);
Mark Slee95771002006-06-07 06:53:25 +0000257 System.out.print(" = {");
258 first = true;
Mark Slee78f58e22006-09-02 04:17:07 +0000259 for (int elem : listin) {
Mark Slee95771002006-06-07 06:53:25 +0000260 if (first) {
261 first = false;
262 } else {
263 System.out.print(", ");
264 }
Mark Slee78f58e22006-09-02 04:17:07 +0000265 System.out.print(elem);
Mark Slee95771002006-06-07 06:53:25 +0000266 }
267 System.out.print("}\n");
268
269 /**
270 * ENUM TEST
271 */
272 System.out.print("testEnum(ONE)");
Mark Slee78f58e22006-09-02 04:17:07 +0000273 int ret = testClient.testEnum(Numberz.ONE);
274 System.out.print(" = " + ret + "\n");
Mark Slee95771002006-06-07 06:53:25 +0000275
276 System.out.print("testEnum(TWO)");
277 ret = testClient.testEnum(Numberz.TWO);
Mark Slee78f58e22006-09-02 04:17:07 +0000278 System.out.print(" = " + ret + "\n");
Mark Slee95771002006-06-07 06:53:25 +0000279
280 System.out.print("testEnum(THREE)");
281 ret = testClient.testEnum(Numberz.THREE);
Mark Slee78f58e22006-09-02 04:17:07 +0000282 System.out.print(" = " + ret + "\n");
Mark Slee95771002006-06-07 06:53:25 +0000283
284 System.out.print("testEnum(FIVE)");
285 ret = testClient.testEnum(Numberz.FIVE);
Mark Slee78f58e22006-09-02 04:17:07 +0000286 System.out.print(" = " + ret + "\n");
Mark Slee95771002006-06-07 06:53:25 +0000287
288 System.out.print("testEnum(EIGHT)");
289 ret = testClient.testEnum(Numberz.EIGHT);
Mark Slee78f58e22006-09-02 04:17:07 +0000290 System.out.print(" = " + ret + "\n");
Mark Slee95771002006-06-07 06:53:25 +0000291
292 /**
293 * TYPEDEF TEST
294 */
295 System.out.print("testTypedef(309858235082523)");
Mark Slee78f58e22006-09-02 04:17:07 +0000296 long uid = testClient.testTypedef(309858235082523L);
297 System.out.print(" = " + uid + "\n");
Mark Slee95771002006-06-07 06:53:25 +0000298
299 /**
300 * NESTED MAP TEST
301 */
302 System.out.print("testMapMap(1)");
Mark Slee22360b22008-02-09 00:18:32 +0000303 Map<Integer,Map<Integer,Integer>> mm =
Mark Slee78f58e22006-09-02 04:17:07 +0000304 testClient.testMapMap(1);
Mark Slee95771002006-06-07 06:53:25 +0000305 System.out.print(" = {");
Mark Slee78f58e22006-09-02 04:17:07 +0000306 for (int key : mm.keySet()) {
307 System.out.print(key + " => {");
Mark Slee22360b22008-02-09 00:18:32 +0000308 Map<Integer,Integer> m2 = mm.get(key);
Mark Slee78f58e22006-09-02 04:17:07 +0000309 for (int k2 : m2.keySet()) {
310 System.out.print(k2 + " => " + m2.get(k2) + ", ");
Mark Slee95771002006-06-07 06:53:25 +0000311 }
312 System.out.print("}, ");
313 }
314 System.out.print("}\n");
315
316 /**
317 * INSANITY TEST
318 */
Mark Slee844ac122007-11-27 08:38:52 +0000319 insane = new Insanity();
Mark Sleee129a2d2007-02-21 05:17:48 +0000320 insane.userMap = new HashMap<Integer, Long>();
Mark Slee78f58e22006-09-02 04:17:07 +0000321 insane.userMap.put(Numberz.FIVE, (long)5000);
Mark Slee95771002006-06-07 06:53:25 +0000322 Xtruct truck = new Xtruct();
Mark Slee78f58e22006-09-02 04:17:07 +0000323 truck.string_thing = "Truck";
324 truck.byte_thing = (byte)8;
325 truck.i32_thing = 8;
326 truck.i64_thing = 8;
Mark Sleee129a2d2007-02-21 05:17:48 +0000327 insane.xtructs = new ArrayList<Xtruct>();
Mark Slee95771002006-06-07 06:53:25 +0000328 insane.xtructs.add(truck);
329 System.out.print("testInsanity()");
Mark Slee22360b22008-02-09 00:18:32 +0000330 Map<Long,Map<Integer,Insanity>> whoa =
Mark Slee95771002006-06-07 06:53:25 +0000331 testClient.testInsanity(insane);
332 System.out.print(" = {");
Mark Slee78f58e22006-09-02 04:17:07 +0000333 for (long key : whoa.keySet()) {
Mark Slee22360b22008-02-09 00:18:32 +0000334 Map<Integer,Insanity> val = whoa.get(key);
Mark Slee78f58e22006-09-02 04:17:07 +0000335 System.out.print(key + " => {");
Mark Slee95771002006-06-07 06:53:25 +0000336
Mark Slee78f58e22006-09-02 04:17:07 +0000337 for (int k2 : val.keySet()) {
Mark Slee95771002006-06-07 06:53:25 +0000338 Insanity v2 = val.get(k2);
Mark Slee78f58e22006-09-02 04:17:07 +0000339 System.out.print(k2 + " => {");
Mark Slee22360b22008-02-09 00:18:32 +0000340 Map<Integer, Long> userMap = v2.userMap;
Mark Slee95771002006-06-07 06:53:25 +0000341 System.out.print("{");
Mark Sleefa6ac9f2007-05-04 18:49:56 +0000342 if (userMap != null) {
343 for (int k3 : userMap.keySet()) {
344 System.out.print(k3 + " => " + userMap.get(k3) + ", ");
345 }
Mark Slee95771002006-06-07 06:53:25 +0000346 }
347 System.out.print("}, ");
348
Mark Slee22360b22008-02-09 00:18:32 +0000349 List<Xtruct> xtructs = v2.xtructs;
Mark Slee95771002006-06-07 06:53:25 +0000350 System.out.print("{");
Mark Sleefa6ac9f2007-05-04 18:49:56 +0000351 if (xtructs != null) {
352 for (Xtruct x : xtructs) {
353 System.out.print("{" + "\"" + x.string_thing + "\", " + x.byte_thing + ", " + x.i32_thing + ", "+ x.i64_thing + "}, ");
354 }
Mark Slee95771002006-06-07 06:53:25 +0000355 }
356 System.out.print("}");
357
358 System.out.print("}, ");
359 }
360 System.out.print("}, ");
361 }
362 System.out.print("}\n");
363
David Reiss2ab6fe82008-02-18 02:11:44 +0000364 // Test async
365 System.out.print("testAsync(3)...");
366 long startAsync = System.nanoTime();
367 testClient.testAsync(3);
368 long asyncElapsedMillis = (System.nanoTime() - startAsync) / 1000000;
369 if (asyncElapsedMillis > 200) {
370 throw new Exception("Async test failed: took " +
371 Long.toString(asyncElapsedMillis) +
372 "ms");
373 } else {
374 System.out.println("Success - took " +
375 Long.toString(asyncElapsedMillis) +
376 "ms");
377 }
378
379
Mark Sleed788b2e2006-09-07 01:26:35 +0000380 long stop = System.nanoTime();
381 long tot = stop-start;
382
383 System.out.println("Total time: " + tot/1000 + "us");
384
385 if (timeMin == 0 || tot < timeMin) {
386 timeMin = tot;
387 }
388 if (tot > timeMax) {
389 timeMax = tot;
390 }
391 timeTot += tot;
Mark Slee95771002006-06-07 06:53:25 +0000392
Mark Sleeb9acf982006-10-10 01:57:32 +0000393 transport.close();
Mark Slee95771002006-06-07 06:53:25 +0000394 }
Mark Sleed788b2e2006-09-07 01:26:35 +0000395
396 long timeAvg = timeTot / numTests;
Mark Slee844ac122007-11-27 08:38:52 +0000397
Mark Sleed788b2e2006-09-07 01:26:35 +0000398 System.out.println("Min time: " + timeMin/1000 + "us");
399 System.out.println("Max time: " + timeMax/1000 + "us");
400 System.out.println("Avg time: " + timeAvg/1000 + "us");
Mark Slee844ac122007-11-27 08:38:52 +0000401
David Reiss4f15f592008-02-23 22:07:43 +0000402 String json = (new TSerializer(new TSimpleJSONProtocol.Factory())).toString(insane);
Mark Slee844ac122007-11-27 08:38:52 +0000403
404 System.out.println("\nFor good meausre here is some JSON:\n" + json);
405
Mark Slee95771002006-06-07 06:53:25 +0000406 } catch (Exception x) {
407 x.printStackTrace();
Mark Slee844ac122007-11-27 08:38:52 +0000408 }
Mark Sleed788b2e2006-09-07 01:26:35 +0000409
Mark Slee95771002006-06-07 06:53:25 +0000410 }
Mark Sleed788b2e2006-09-07 01:26:35 +0000411
Mark Slee95771002006-06-07 06:53:25 +0000412}