thrift-mavericks 0.8.0 → 0.9.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +8 -8
  2. data/ext/binary_protocol_accelerated.c +21 -2
  3. data/ext/bytes.c +36 -0
  4. data/ext/bytes.h +31 -0
  5. data/ext/compact_protocol.c +24 -7
  6. data/ext/constants.h +5 -5
  7. data/ext/extconf.rb +3 -1
  8. data/ext/memory_buffer.c +11 -8
  9. data/ext/protocol.c +0 -185
  10. data/ext/protocol.h +0 -20
  11. data/ext/struct.c +0 -3
  12. data/ext/thrift_native.c +10 -11
  13. data/lib/thrift.rb +3 -0
  14. data/lib/thrift/bytes.rb +131 -0
  15. data/lib/thrift/exceptions.rb +3 -0
  16. data/lib/thrift/protocol/base_protocol.rb +96 -9
  17. data/lib/thrift/protocol/binary_protocol.rb +15 -7
  18. data/lib/thrift/protocol/compact_protocol.rb +14 -6
  19. data/lib/thrift/protocol/json_protocol.rb +766 -0
  20. data/lib/thrift/server/mongrel_http_server.rb +2 -0
  21. data/lib/thrift/server/thin_http_server.rb +91 -0
  22. data/lib/thrift/struct.rb +1 -1
  23. data/lib/thrift/struct_union.rb +2 -2
  24. data/lib/thrift/transport/base_transport.rb +22 -20
  25. data/lib/thrift/transport/buffered_transport.rb +16 -10
  26. data/lib/thrift/transport/framed_transport.rb +11 -10
  27. data/lib/thrift/transport/http_client_transport.rb +11 -6
  28. data/lib/thrift/transport/io_stream_transport.rb +1 -1
  29. data/lib/thrift/transport/memory_buffer_transport.rb +6 -6
  30. data/lib/thrift/transport/socket.rb +4 -2
  31. data/spec/ThriftSpec.thrift +52 -1
  32. data/spec/base_protocol_spec.rb +108 -51
  33. data/spec/base_transport_spec.rb +49 -50
  34. data/spec/binary_protocol_accelerated_spec.rb +9 -13
  35. data/spec/binary_protocol_spec.rb +15 -10
  36. data/spec/binary_protocol_spec_shared.rb +92 -12
  37. data/spec/bytes_spec.rb +160 -0
  38. data/spec/client_spec.rb +13 -14
  39. data/spec/compact_protocol_spec.rb +4 -5
  40. data/spec/exception_spec.rb +39 -40
  41. data/spec/gen-rb/thrift_spec_types.rb +192 -0
  42. data/spec/http_client_spec.rb +65 -9
  43. data/spec/json_protocol_spec.rb +513 -0
  44. data/spec/nonblocking_server_spec.rb +18 -20
  45. data/spec/processor_spec.rb +13 -16
  46. data/spec/serializer_spec.rb +17 -19
  47. data/spec/server_socket_spec.rb +6 -7
  48. data/spec/server_spec.rb +46 -58
  49. data/spec/socket_spec.rb +11 -11
  50. data/spec/socket_spec_shared.rb +1 -1
  51. data/spec/spec_helper.rb +13 -10
  52. data/spec/struct_nested_containers_spec.rb +191 -0
  53. data/spec/struct_spec.rb +84 -86
  54. data/spec/thin_http_server_spec.rb +140 -0
  55. data/spec/types_spec.rb +65 -66
  56. data/spec/union_spec.rb +57 -47
  57. data/spec/unix_socket_spec.rb +8 -9
  58. metadata +72 -14
  59. data/spec/mongrel_http_server_spec.rb +0 -117
@@ -0,0 +1,513 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Licensed to the Apache Software Foundation (ASF) under one
4
+ # or more contributor license agreements. See the NOTICE file
5
+ # distributed with this work for additional information
6
+ # regarding copyright ownership. The ASF licenses this file
7
+ # to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance
9
+ # with the License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing,
14
+ # software distributed under the License is distributed on an
15
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ # KIND, either express or implied. See the License for the
17
+ # specific language governing permissions and limitations
18
+ # under the License.
19
+ #
20
+
21
+ require 'spec_helper'
22
+
23
+ describe 'JsonProtocol' do
24
+
25
+ describe Thrift::JsonProtocol do
26
+ before(:each) do
27
+ @trans = Thrift::MemoryBufferTransport.new
28
+ @prot = Thrift::JsonProtocol.new(@trans)
29
+ end
30
+
31
+ it "should write json escaped char" do
32
+ @prot.write_json_escape_char("\n")
33
+ @trans.read(@trans.available).should == '\u000a'
34
+
35
+ @prot.write_json_escape_char(" ")
36
+ @trans.read(@trans.available).should == '\u0020'
37
+ end
38
+
39
+ it "should write json char" do
40
+ @prot.write_json_char("\n")
41
+ @trans.read(@trans.available).should == '\\n'
42
+
43
+ @prot.write_json_char(" ")
44
+ @trans.read(@trans.available).should == ' '
45
+
46
+ @prot.write_json_char("\\")
47
+ @trans.read(@trans.available).should == "\\\\"
48
+
49
+ @prot.write_json_char("@")
50
+ @trans.read(@trans.available).should == '@'
51
+ end
52
+
53
+ it "should write json string" do
54
+ @prot.write_json_string("this is a \\ json\nstring")
55
+ @trans.read(@trans.available).should == "\"this is a \\\\ json\\nstring\""
56
+ end
57
+
58
+ it "should write json base64" do
59
+ @prot.write_json_base64("this is a base64 string")
60
+ @trans.read(@trans.available).should == "\"\"dGhpcyBpcyBhIGJhc2U2NCBzdHJpbmc=\\n\"\""
61
+ end
62
+
63
+ it "should write json integer" do
64
+ @prot.write_json_integer(45)
65
+ @trans.read(@trans.available).should == "45"
66
+
67
+ @prot.write_json_integer(33000)
68
+ @trans.read(@trans.available).should == "33000"
69
+
70
+ @prot.write_json_integer(3000000000)
71
+ @trans.read(@trans.available).should == "3000000000"
72
+
73
+ @prot.write_json_integer(6000000000)
74
+ @trans.read(@trans.available).should == "6000000000"
75
+ end
76
+
77
+ it "should write json double" do
78
+ @prot.write_json_double(12.3)
79
+ @trans.read(@trans.available).should == "12.3"
80
+
81
+ @prot.write_json_double(-3.21)
82
+ @trans.read(@trans.available).should == "-3.21"
83
+
84
+ @prot.write_json_double(((+1.0/0.0)/(+1.0/0.0)))
85
+ @trans.read(@trans.available).should == "\"NaN\""
86
+
87
+ @prot.write_json_double((+1.0/0.0))
88
+ @trans.read(@trans.available).should == "\"Infinity\""
89
+
90
+ @prot.write_json_double((-1.0/0.0))
91
+ @trans.read(@trans.available).should == "\"-Infinity\""
92
+ end
93
+
94
+ it "should write json object start" do
95
+ @prot.write_json_object_start
96
+ @trans.read(@trans.available).should == "{"
97
+ end
98
+
99
+ it "should write json object end" do
100
+ @prot.write_json_object_end
101
+ @trans.read(@trans.available).should == "}"
102
+ end
103
+
104
+ it "should write json array start" do
105
+ @prot.write_json_array_start
106
+ @trans.read(@trans.available).should == "["
107
+ end
108
+
109
+ it "should write json array end" do
110
+ @prot.write_json_array_end
111
+ @trans.read(@trans.available).should == "]"
112
+ end
113
+
114
+ it "should write message begin" do
115
+ @prot.write_message_begin("name", 12, 32)
116
+ @trans.read(@trans.available).should == "[1,\"name\",12,32"
117
+ end
118
+
119
+ it "should write message end" do
120
+ @prot.write_message_end
121
+ @trans.read(@trans.available).should == "]"
122
+ end
123
+
124
+ it "should write struct begin" do
125
+ @prot.write_struct_begin("name")
126
+ @trans.read(@trans.available).should == "{"
127
+ end
128
+
129
+ it "should write struct end" do
130
+ @prot.write_struct_end
131
+ @trans.read(@trans.available).should == "}"
132
+ end
133
+
134
+ it "should write field begin" do
135
+ @prot.write_field_begin("name", Thrift::Types::STRUCT, 32)
136
+ @trans.read(@trans.available).should == "32{\"rec\""
137
+ end
138
+
139
+ it "should write field end" do
140
+ @prot.write_field_end
141
+ @trans.read(@trans.available).should == "}"
142
+ end
143
+
144
+ it "should write field stop" do
145
+ @prot.write_field_stop
146
+ @trans.read(@trans.available).should == ""
147
+ end
148
+
149
+ it "should write map begin" do
150
+ @prot.write_map_begin(Thrift::Types::STRUCT, Thrift::Types::LIST, 32)
151
+ @trans.read(@trans.available).should == "[\"rec\",\"lst\",32,{"
152
+ end
153
+
154
+ it "should write map end" do
155
+ @prot.write_map_end
156
+ @trans.read(@trans.available).should == "}]"
157
+ end
158
+
159
+ it "should write list begin" do
160
+ @prot.write_list_begin(Thrift::Types::STRUCT, 32)
161
+ @trans.read(@trans.available).should == "[\"rec\",32"
162
+ end
163
+
164
+ it "should write list end" do
165
+ @prot.write_list_end
166
+ @trans.read(@trans.available).should == "]"
167
+ end
168
+
169
+ it "should write set begin" do
170
+ @prot.write_set_begin(Thrift::Types::STRUCT, 32)
171
+ @trans.read(@trans.available).should == "[\"rec\",32"
172
+ end
173
+
174
+ it "should write set end" do
175
+ @prot.write_set_end
176
+ @trans.read(@trans.available).should == "]"
177
+ end
178
+
179
+ it "should write bool" do
180
+ @prot.write_bool(true)
181
+ @trans.read(@trans.available).should == "1"
182
+
183
+ @prot.write_bool(false)
184
+ @trans.read(@trans.available).should == "0"
185
+ end
186
+
187
+ it "should write byte" do
188
+ @prot.write_byte(100)
189
+ @trans.read(@trans.available).should == "100"
190
+ end
191
+
192
+ it "should write i16" do
193
+ @prot.write_i16(1000)
194
+ @trans.read(@trans.available).should == "1000"
195
+ end
196
+
197
+ it "should write i32" do
198
+ @prot.write_i32(3000000000)
199
+ @trans.read(@trans.available).should == "3000000000"
200
+ end
201
+
202
+ it "should write i64" do
203
+ @prot.write_i64(6000000000)
204
+ @trans.read(@trans.available).should == "6000000000"
205
+ end
206
+
207
+ it "should write double" do
208
+ @prot.write_double(1.23)
209
+ @trans.read(@trans.available).should == "1.23"
210
+
211
+ @prot.write_double(-32.1)
212
+ @trans.read(@trans.available).should == "-32.1"
213
+
214
+ @prot.write_double(((+1.0/0.0)/(+1.0/0.0)))
215
+ @trans.read(@trans.available).should == "\"NaN\""
216
+
217
+ @prot.write_double((+1.0/0.0))
218
+ @trans.read(@trans.available).should == "\"Infinity\""
219
+
220
+ @prot.write_double((-1.0/0.0))
221
+ @trans.read(@trans.available).should == "\"-Infinity\""
222
+ end
223
+
224
+ if RUBY_VERSION >= '1.9'
225
+ it 'should write string' do
226
+ @prot.write_string('this is a test string')
227
+ a = @trans.read(@trans.available)
228
+ a.should == '"this is a test string"'.force_encoding(Encoding::BINARY)
229
+ a.encoding.should == Encoding::BINARY
230
+ end
231
+
232
+ it 'should write string with unicode characters' do
233
+ @prot.write_string("this is a test string with unicode characters: \u20AC \u20AD")
234
+ a = @trans.read(@trans.available)
235
+ a.should == "\"this is a test string with unicode characters: \u20AC \u20AD\"".force_encoding(Encoding::BINARY)
236
+ a.encoding.should == Encoding::BINARY
237
+ end
238
+ else
239
+ it 'should write string' do
240
+ @prot.write_string('this is a test string')
241
+ @trans.read(@trans.available).should == '"this is a test string"'
242
+ end
243
+ end
244
+
245
+ it "should write binary" do
246
+ @prot.write_binary("this is a base64 string")
247
+ @trans.read(@trans.available).should == "\"\"dGhpcyBpcyBhIGJhc2U2NCBzdHJpbmc=\\n\"\""
248
+ end
249
+
250
+ it "should get type name for type id" do
251
+ expect {@prot.get_type_name_for_type_id(Thrift::Types::STOP)}.to raise_error(NotImplementedError)
252
+ expect {@prot.get_type_name_for_type_id(Thrift::Types::VOID)}.to raise_error(NotImplementedError)
253
+ @prot.get_type_name_for_type_id(Thrift::Types::BOOL).should == "tf"
254
+ @prot.get_type_name_for_type_id(Thrift::Types::BYTE).should == "i8"
255
+ @prot.get_type_name_for_type_id(Thrift::Types::DOUBLE).should == "dbl"
256
+ @prot.get_type_name_for_type_id(Thrift::Types::I16).should == "i16"
257
+ @prot.get_type_name_for_type_id(Thrift::Types::I32).should == "i32"
258
+ @prot.get_type_name_for_type_id(Thrift::Types::I64).should == "i64"
259
+ @prot.get_type_name_for_type_id(Thrift::Types::STRING).should == "str"
260
+ @prot.get_type_name_for_type_id(Thrift::Types::STRUCT).should == "rec"
261
+ @prot.get_type_name_for_type_id(Thrift::Types::MAP).should == "map"
262
+ @prot.get_type_name_for_type_id(Thrift::Types::SET).should == "set"
263
+ @prot.get_type_name_for_type_id(Thrift::Types::LIST).should == "lst"
264
+ end
265
+
266
+ it "should get type id for type name" do
267
+ expect {@prot.get_type_id_for_type_name("pp")}.to raise_error(NotImplementedError)
268
+ @prot.get_type_id_for_type_name("tf").should == Thrift::Types::BOOL
269
+ @prot.get_type_id_for_type_name("i8").should == Thrift::Types::BYTE
270
+ @prot.get_type_id_for_type_name("dbl").should == Thrift::Types::DOUBLE
271
+ @prot.get_type_id_for_type_name("i16").should == Thrift::Types::I16
272
+ @prot.get_type_id_for_type_name("i32").should == Thrift::Types::I32
273
+ @prot.get_type_id_for_type_name("i64").should == Thrift::Types::I64
274
+ @prot.get_type_id_for_type_name("str").should == Thrift::Types::STRING
275
+ @prot.get_type_id_for_type_name("rec").should == Thrift::Types::STRUCT
276
+ @prot.get_type_id_for_type_name("map").should == Thrift::Types::MAP
277
+ @prot.get_type_id_for_type_name("set").should == Thrift::Types::SET
278
+ @prot.get_type_id_for_type_name("lst").should == Thrift::Types::LIST
279
+ end
280
+
281
+ it "should read json syntax char" do
282
+ @trans.write('F')
283
+ expect {@prot.read_json_syntax_char('G')}.to raise_error(Thrift::ProtocolException)
284
+ @trans.write('H')
285
+ @prot.read_json_syntax_char('H')
286
+ end
287
+
288
+ it "should read json escape char" do
289
+ @trans.write('0054')
290
+ @prot.read_json_escape_char.should == 'T'
291
+ end
292
+
293
+ it "should read json string" do
294
+ @trans.write("\"\\P")
295
+ expect {@prot.read_json_string(false)}.to raise_error(Thrift::ProtocolException)
296
+
297
+ @trans.write("\"\\n\"")
298
+ @prot.read_json_string(false).should == "\\n"
299
+
300
+ @trans.write("\"this is a test string\"")
301
+ @prot.read_json_string.should == "this is a test string"
302
+ end
303
+
304
+ it "should read json base64" do
305
+ @trans.write("\"dGhpcyBpcyBhIHRlc3Qgc3RyaW5n\"")
306
+ @prot.read_json_base64.should == "this is a test string"
307
+ end
308
+
309
+ it "should is json numeric" do
310
+ @prot.is_json_numeric("A").should == false
311
+ @prot.is_json_numeric("+").should == true
312
+ @prot.is_json_numeric("-").should == true
313
+ @prot.is_json_numeric(".").should == true
314
+ @prot.is_json_numeric("0").should == true
315
+ @prot.is_json_numeric("1").should == true
316
+ @prot.is_json_numeric("2").should == true
317
+ @prot.is_json_numeric("3").should == true
318
+ @prot.is_json_numeric("4").should == true
319
+ @prot.is_json_numeric("5").should == true
320
+ @prot.is_json_numeric("6").should == true
321
+ @prot.is_json_numeric("7").should == true
322
+ @prot.is_json_numeric("8").should == true
323
+ @prot.is_json_numeric("9").should == true
324
+ @prot.is_json_numeric("E").should == true
325
+ @prot.is_json_numeric("e").should == true
326
+ end
327
+
328
+ it "should read json numeric chars" do
329
+ @trans.write("1.453E45T")
330
+ @prot.read_json_numeric_chars.should == "1.453E45"
331
+ end
332
+
333
+ it "should read json integer" do
334
+ @trans.write("1.45\"\"")
335
+ expect {@prot.read_json_integer}.to raise_error(Thrift::ProtocolException)
336
+ @prot.read_string
337
+
338
+ @trans.write("1453T")
339
+ @prot.read_json_integer.should == 1453
340
+ end
341
+
342
+ it "should read json double" do
343
+ @trans.write("1.45e3e01\"\"")
344
+ expect {@prot.read_json_double}.to raise_error(Thrift::ProtocolException)
345
+ @prot.read_string
346
+
347
+ @trans.write("\"1.453e01\"")
348
+ expect {@prot.read_json_double}.to raise_error(Thrift::ProtocolException)
349
+
350
+ @trans.write("1.453e01\"\"")
351
+ @prot.read_json_double.should == 14.53
352
+ @prot.read_string
353
+
354
+ @trans.write("\"NaN\"")
355
+ @prot.read_json_double.nan?.should == true
356
+
357
+ @trans.write("\"Infinity\"")
358
+ @prot.read_json_double.should == +1.0/0.0
359
+
360
+ @trans.write("\"-Infinity\"")
361
+ @prot.read_json_double.should == -1.0/0.0
362
+ end
363
+
364
+ it "should read json object start" do
365
+ @trans.write("{")
366
+ @prot.read_json_object_start.should == nil
367
+ end
368
+
369
+ it "should read json object end" do
370
+ @trans.write("}")
371
+ @prot.read_json_object_end.should == nil
372
+ end
373
+
374
+ it "should read json array start" do
375
+ @trans.write("[")
376
+ @prot.read_json_array_start.should == nil
377
+ end
378
+
379
+ it "should read json array end" do
380
+ @trans.write("]")
381
+ @prot.read_json_array_end.should == nil
382
+ end
383
+
384
+ it "should read_message_begin" do
385
+ @trans.write("[2,")
386
+ expect {@prot.read_message_begin}.to raise_error(Thrift::ProtocolException)
387
+
388
+ @trans.write("[1,\"name\",12,32\"\"")
389
+ @prot.read_message_begin.should == ["name", 12, 32]
390
+ end
391
+
392
+ it "should read message end" do
393
+ @trans.write("]")
394
+ @prot.read_message_end.should == nil
395
+ end
396
+
397
+ it "should read struct begin" do
398
+ @trans.write("{")
399
+ @prot.read_struct_begin.should == nil
400
+ end
401
+
402
+ it "should read struct end" do
403
+ @trans.write("}")
404
+ @prot.read_struct_end.should == nil
405
+ end
406
+
407
+ it "should read field begin" do
408
+ @trans.write("1{\"rec\"")
409
+ @prot.read_field_begin.should == [nil, 12, 1]
410
+ end
411
+
412
+ it "should read field end" do
413
+ @trans.write("}")
414
+ @prot.read_field_end.should == nil
415
+ end
416
+
417
+ it "should read map begin" do
418
+ @trans.write("[\"rec\",\"lst\",2,{")
419
+ @prot.read_map_begin.should == [12, 15, 2]
420
+ end
421
+
422
+ it "should read map end" do
423
+ @trans.write("}]")
424
+ @prot.read_map_end.should == nil
425
+ end
426
+
427
+ it "should read list begin" do
428
+ @trans.write("[\"rec\",2\"\"")
429
+ @prot.read_list_begin.should == [12, 2]
430
+ end
431
+
432
+ it "should read list end" do
433
+ @trans.write("]")
434
+ @prot.read_list_end.should == nil
435
+ end
436
+
437
+ it "should read set begin" do
438
+ @trans.write("[\"rec\",2\"\"")
439
+ @prot.read_set_begin.should == [12, 2]
440
+ end
441
+
442
+ it "should read set end" do
443
+ @trans.write("]")
444
+ @prot.read_set_end.should == nil
445
+ end
446
+
447
+ it "should read bool" do
448
+ @trans.write("0\"\"")
449
+ @prot.read_bool.should == false
450
+ @prot.read_string
451
+
452
+ @trans.write("1\"\"")
453
+ @prot.read_bool.should == true
454
+ end
455
+
456
+ it "should read byte" do
457
+ @trans.write("60\"\"")
458
+ @prot.read_byte.should == 60
459
+ end
460
+
461
+ it "should read i16" do
462
+ @trans.write("1000\"\"")
463
+ @prot.read_i16.should == 1000
464
+ end
465
+
466
+ it "should read i32" do
467
+ @trans.write("3000000000\"\"")
468
+ @prot.read_i32.should == 3000000000
469
+ end
470
+
471
+ it "should read i64" do
472
+ @trans.write("6000000000\"\"")
473
+ @prot.read_i64.should == 6000000000
474
+ end
475
+
476
+ it "should read double" do
477
+ @trans.write("12.23\"\"")
478
+ @prot.read_double.should == 12.23
479
+ end
480
+
481
+ if RUBY_VERSION >= '1.9'
482
+ it 'should read string' do
483
+ @trans.write('"this is a test string"'.force_encoding(Encoding::BINARY))
484
+ a = @prot.read_string
485
+ a.should == 'this is a test string'
486
+ a.encoding.should == Encoding::UTF_8
487
+ end
488
+
489
+ it 'should read string with unicode characters' do
490
+ @trans.write('"this is a test string with unicode characters: \u20AC \u20AD"'.force_encoding(Encoding::BINARY))
491
+ a = @prot.read_string
492
+ a.should == "this is a test string with unicode characters: \u20AC \u20AD"
493
+ a.encoding.should == Encoding::UTF_8
494
+ end
495
+ else
496
+ it 'should read string' do
497
+ @trans.write('"this is a test string"')
498
+ @prot.read_string.should == 'this is a test string'
499
+ end
500
+ end
501
+
502
+ it "should read binary" do
503
+ @trans.write("\"dGhpcyBpcyBhIHRlc3Qgc3RyaW5n\"")
504
+ @prot.read_binary.should == "this is a test string"
505
+ end
506
+ end
507
+
508
+ describe Thrift::JsonProtocolFactory do
509
+ it "should create a JsonProtocol" do
510
+ Thrift::JsonProtocolFactory.new.get_protocol(mock("MockTransport")).should be_instance_of(Thrift::JsonProtocol)
511
+ end
512
+ end
513
+ end