thrift-mavericks 0.8.0 → 0.9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  #
2
3
  # Licensed to the Apache Software Foundation (ASF) under one
3
4
  # or more contributor license agreements. See the NOTICE file
@@ -17,7 +18,7 @@
17
18
  # under the License.
18
19
  #
19
20
 
20
- require File.expand_path("#{File.dirname(__FILE__)}/spec_helper")
21
+ require 'spec_helper'
21
22
 
22
23
  describe Thrift::CompactProtocol do
23
24
  TESTS = {
@@ -25,7 +26,7 @@ describe Thrift::CompactProtocol do
25
26
  :i16 => (0..14).map {|shift| [1 << shift, -(1 << shift)]}.flatten.sort,
26
27
  :i32 => (0..30).map {|shift| [1 << shift, -(1 << shift)]}.flatten.sort,
27
28
  :i64 => (0..62).map {|shift| [1 << shift, -(1 << shift)]}.flatten.sort,
28
- :string => ["", "1", "short", "fourteen123456", "fifteen12345678", "1" * 127, "1" * 3000],
29
+ :string => ["", "1", "short", "fourteen123456", "fifteen12345678", "unicode characters: \u20AC \u20AD", "1" * 127, "1" * 3000],
29
30
  :binary => ["", "\001", "\001" * 5, "\001" * 14, "\001" * 15, "\001" * 127, "\001" * 3000],
30
31
  :double => [0.0, 1.0, -1.0, 1.1, -1.1, 10000000.1, 1.0/0.0, -1.0/0.0],
31
32
  :bool => [true, false]
@@ -133,12 +134,10 @@ describe Thrift::CompactProtocol do
133
134
  end
134
135
 
135
136
  def writer(sym)
136
- sym = sym == :binary ? :string : sym
137
137
  "write_#{sym.to_s}"
138
138
  end
139
139
 
140
140
  def reader(sym)
141
- sym = sym == :binary ? :string : sym
142
141
  "read_#{sym.to_s}"
143
142
  end
144
- end
143
+ end
@@ -17,29 +17,28 @@
17
17
  # under the License.
18
18
  #
19
19
 
20
- require File.expand_path("#{File.dirname(__FILE__)}/spec_helper")
20
+ require 'spec_helper'
21
21
 
22
- class ThriftExceptionSpec < Spec::ExampleGroup
23
- include Thrift
22
+ describe 'Exception' do
24
23
 
25
- describe Exception do
24
+ describe Thrift::Exception do
26
25
  it "should have an accessible message" do
27
- e = Exception.new("test message")
26
+ e = Thrift::Exception.new("test message")
28
27
  e.message.should == "test message"
29
28
  end
30
29
  end
31
30
 
32
- describe ApplicationException do
31
+ describe Thrift::ApplicationException do
33
32
  it "should inherit from Thrift::Exception" do
34
- ApplicationException.superclass.should == Exception
33
+ Thrift::ApplicationException.superclass.should == Thrift::Exception
35
34
  end
36
35
 
37
36
  it "should have an accessible type and message" do
38
- e = ApplicationException.new
39
- e.type.should == ApplicationException::UNKNOWN
37
+ e = Thrift::ApplicationException.new
38
+ e.type.should == Thrift::ApplicationException::UNKNOWN
40
39
  e.message.should be_nil
41
- e = ApplicationException.new(ApplicationException::UNKNOWN_METHOD, "test message")
42
- e.type.should == ApplicationException::UNKNOWN_METHOD
40
+ e = Thrift::ApplicationException.new(Thrift::ApplicationException::UNKNOWN_METHOD, "test message")
41
+ e.type.should == Thrift::ApplicationException::UNKNOWN_METHOD
43
42
  e.message.should == "test message"
44
43
  end
45
44
 
@@ -47,79 +46,79 @@ class ThriftExceptionSpec < Spec::ExampleGroup
47
46
  prot = mock("MockProtocol")
48
47
  prot.should_receive(:read_struct_begin).ordered
49
48
  prot.should_receive(:read_field_begin).exactly(3).times.and_return(
50
- ["message", Types::STRING, 1],
51
- ["type", Types::I32, 2],
52
- [nil, Types::STOP, 0]
49
+ ["message", Thrift::Types::STRING, 1],
50
+ ["type", Thrift::Types::I32, 2],
51
+ [nil, Thrift::Types::STOP, 0]
53
52
  )
54
53
  prot.should_receive(:read_string).ordered.and_return "test message"
55
- prot.should_receive(:read_i32).ordered.and_return ApplicationException::BAD_SEQUENCE_ID
54
+ prot.should_receive(:read_i32).ordered.and_return Thrift::ApplicationException::BAD_SEQUENCE_ID
56
55
  prot.should_receive(:read_field_end).exactly(2).times
57
56
  prot.should_receive(:read_struct_end).ordered
58
57
 
59
- e = ApplicationException.new
58
+ e = Thrift::ApplicationException.new
60
59
  e.read(prot)
61
60
  e.message.should == "test message"
62
- e.type.should == ApplicationException::BAD_SEQUENCE_ID
61
+ e.type.should == Thrift::ApplicationException::BAD_SEQUENCE_ID
63
62
  end
64
63
 
65
64
  it "should skip bad fields when reading a struct" do
66
65
  prot = mock("MockProtocol")
67
66
  prot.should_receive(:read_struct_begin).ordered
68
67
  prot.should_receive(:read_field_begin).exactly(5).times.and_return(
69
- ["type", Types::I32, 2],
70
- ["type", Types::STRING, 2],
71
- ["message", Types::MAP, 1],
72
- ["message", Types::STRING, 3],
73
- [nil, Types::STOP, 0]
68
+ ["type", Thrift::Types::I32, 2],
69
+ ["type", Thrift::Types::STRING, 2],
70
+ ["message", Thrift::Types::MAP, 1],
71
+ ["message", Thrift::Types::STRING, 3],
72
+ [nil, Thrift::Types::STOP, 0]
74
73
  )
75
- prot.should_receive(:read_i32).and_return ApplicationException::INVALID_MESSAGE_TYPE
76
- prot.should_receive(:skip).with(Types::STRING).twice
77
- prot.should_receive(:skip).with(Types::MAP)
74
+ prot.should_receive(:read_i32).and_return Thrift::ApplicationException::INVALID_MESSAGE_TYPE
75
+ prot.should_receive(:skip).with(Thrift::Types::STRING).twice
76
+ prot.should_receive(:skip).with(Thrift::Types::MAP)
78
77
  prot.should_receive(:read_field_end).exactly(4).times
79
78
  prot.should_receive(:read_struct_end).ordered
80
79
 
81
- e = ApplicationException.new
80
+ e = Thrift::ApplicationException.new
82
81
  e.read(prot)
83
82
  e.message.should be_nil
84
- e.type.should == ApplicationException::INVALID_MESSAGE_TYPE
83
+ e.type.should == Thrift::ApplicationException::INVALID_MESSAGE_TYPE
85
84
  end
86
85
 
87
86
  it "should write a Thrift::ApplicationException struct to the oprot" do
88
87
  prot = mock("MockProtocol")
89
88
  prot.should_receive(:write_struct_begin).with("Thrift::ApplicationException").ordered
90
- prot.should_receive(:write_field_begin).with("message", Types::STRING, 1).ordered
89
+ prot.should_receive(:write_field_begin).with("message", Thrift::Types::STRING, 1).ordered
91
90
  prot.should_receive(:write_string).with("test message").ordered
92
- prot.should_receive(:write_field_begin).with("type", Types::I32, 2).ordered
93
- prot.should_receive(:write_i32).with(ApplicationException::UNKNOWN_METHOD).ordered
91
+ prot.should_receive(:write_field_begin).with("type", Thrift::Types::I32, 2).ordered
92
+ prot.should_receive(:write_i32).with(Thrift::ApplicationException::UNKNOWN_METHOD).ordered
94
93
  prot.should_receive(:write_field_end).twice
95
94
  prot.should_receive(:write_field_stop).ordered
96
95
  prot.should_receive(:write_struct_end).ordered
97
96
 
98
- e = ApplicationException.new(ApplicationException::UNKNOWN_METHOD, "test message")
97
+ e = Thrift::ApplicationException.new(Thrift::ApplicationException::UNKNOWN_METHOD, "test message")
99
98
  e.write(prot)
100
99
  end
101
100
 
102
101
  it "should skip nil fields when writing to the oprot" do
103
102
  prot = mock("MockProtocol")
104
103
  prot.should_receive(:write_struct_begin).with("Thrift::ApplicationException").ordered
105
- prot.should_receive(:write_field_begin).with("message", Types::STRING, 1).ordered
104
+ prot.should_receive(:write_field_begin).with("message", Thrift::Types::STRING, 1).ordered
106
105
  prot.should_receive(:write_string).with("test message").ordered
107
106
  prot.should_receive(:write_field_end).ordered
108
107
  prot.should_receive(:write_field_stop).ordered
109
108
  prot.should_receive(:write_struct_end).ordered
110
109
 
111
- e = ApplicationException.new(nil, "test message")
110
+ e = Thrift::ApplicationException.new(nil, "test message")
112
111
  e.write(prot)
113
112
 
114
113
  prot = mock("MockProtocol")
115
114
  prot.should_receive(:write_struct_begin).with("Thrift::ApplicationException").ordered
116
- prot.should_receive(:write_field_begin).with("type", Types::I32, 2).ordered
117
- prot.should_receive(:write_i32).with(ApplicationException::BAD_SEQUENCE_ID).ordered
115
+ prot.should_receive(:write_field_begin).with("type", Thrift::Types::I32, 2).ordered
116
+ prot.should_receive(:write_i32).with(Thrift::ApplicationException::BAD_SEQUENCE_ID).ordered
118
117
  prot.should_receive(:write_field_end).ordered
119
118
  prot.should_receive(:write_field_stop).ordered
120
119
  prot.should_receive(:write_struct_end).ordered
121
120
 
122
- e = ApplicationException.new(ApplicationException::BAD_SEQUENCE_ID)
121
+ e = Thrift::ApplicationException.new(Thrift::ApplicationException::BAD_SEQUENCE_ID)
123
122
  e.write(prot)
124
123
 
125
124
  prot = mock("MockProtocol")
@@ -127,15 +126,15 @@ class ThriftExceptionSpec < Spec::ExampleGroup
127
126
  prot.should_receive(:write_field_stop).ordered
128
127
  prot.should_receive(:write_struct_end).ordered
129
128
 
130
- e = ApplicationException.new(nil)
129
+ e = Thrift::ApplicationException.new(nil)
131
130
  e.write(prot)
132
131
  end
133
132
  end
134
133
 
135
- describe ProtocolException do
134
+ describe Thrift::ProtocolException do
136
135
  it "should have an accessible type" do
137
- prot = ProtocolException.new(ProtocolException::SIZE_LIMIT, "message")
138
- prot.type.should == ProtocolException::SIZE_LIMIT
136
+ prot = Thrift::ProtocolException.new(Thrift::ProtocolException::SIZE_LIMIT, "message")
137
+ prot.type.should == Thrift::ProtocolException::SIZE_LIMIT
139
138
  prot.message.should == "message"
140
139
  end
141
140
  end
@@ -343,4 +343,196 @@ module SpecNamespace
343
343
  ::Thrift::Struct.generate_accessors self
344
344
  end
345
345
 
346
+ class NestedListInList
347
+ include ::Thrift::Struct, ::Thrift::Struct_Union
348
+ VALUE = 1
349
+
350
+ FIELDS = {
351
+ VALUE => {:type => ::Thrift::Types::LIST, :name => 'value', :element => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::BYTE}}}
352
+ }
353
+
354
+ def struct_fields; FIELDS; end
355
+
356
+ def validate
357
+ end
358
+
359
+ ::Thrift::Struct.generate_accessors self
360
+ end
361
+
362
+ class NestedListInSet
363
+ include ::Thrift::Struct, ::Thrift::Struct_Union
364
+ VALUE = 1
365
+
366
+ FIELDS = {
367
+ VALUE => {:type => ::Thrift::Types::SET, :name => 'value', :element => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::BYTE}}}
368
+ }
369
+
370
+ def struct_fields; FIELDS; end
371
+
372
+ def validate
373
+ end
374
+
375
+ ::Thrift::Struct.generate_accessors self
376
+ end
377
+
378
+ class NestedListInMapKey
379
+ include ::Thrift::Struct, ::Thrift::Struct_Union
380
+ VALUE = 1
381
+
382
+ FIELDS = {
383
+ VALUE => {:type => ::Thrift::Types::MAP, :name => 'value', :key => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::BYTE}}, :value => {:type => ::Thrift::Types::BYTE}}
384
+ }
385
+
386
+ def struct_fields; FIELDS; end
387
+
388
+ def validate
389
+ end
390
+
391
+ ::Thrift::Struct.generate_accessors self
392
+ end
393
+
394
+ class NestedListInMapValue
395
+ include ::Thrift::Struct, ::Thrift::Struct_Union
396
+ VALUE = 1
397
+
398
+ FIELDS = {
399
+ VALUE => {:type => ::Thrift::Types::MAP, :name => 'value', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::BYTE}}}
400
+ }
401
+
402
+ def struct_fields; FIELDS; end
403
+
404
+ def validate
405
+ end
406
+
407
+ ::Thrift::Struct.generate_accessors self
408
+ end
409
+
410
+ class NestedSetInList
411
+ include ::Thrift::Struct, ::Thrift::Struct_Union
412
+ VALUE = 1
413
+
414
+ FIELDS = {
415
+ VALUE => {:type => ::Thrift::Types::LIST, :name => 'value', :element => {:type => ::Thrift::Types::SET, :element => {:type => ::Thrift::Types::BYTE}}}
416
+ }
417
+
418
+ def struct_fields; FIELDS; end
419
+
420
+ def validate
421
+ end
422
+
423
+ ::Thrift::Struct.generate_accessors self
424
+ end
425
+
426
+ class NestedSetInSet
427
+ include ::Thrift::Struct, ::Thrift::Struct_Union
428
+ VALUE = 1
429
+
430
+ FIELDS = {
431
+ VALUE => {:type => ::Thrift::Types::SET, :name => 'value', :element => {:type => ::Thrift::Types::SET, :element => {:type => ::Thrift::Types::BYTE}}}
432
+ }
433
+
434
+ def struct_fields; FIELDS; end
435
+
436
+ def validate
437
+ end
438
+
439
+ ::Thrift::Struct.generate_accessors self
440
+ end
441
+
442
+ class NestedSetInMapKey
443
+ include ::Thrift::Struct, ::Thrift::Struct_Union
444
+ VALUE = 1
445
+
446
+ FIELDS = {
447
+ VALUE => {:type => ::Thrift::Types::MAP, :name => 'value', :key => {:type => ::Thrift::Types::SET, :element => {:type => ::Thrift::Types::BYTE}}, :value => {:type => ::Thrift::Types::BYTE}}
448
+ }
449
+
450
+ def struct_fields; FIELDS; end
451
+
452
+ def validate
453
+ end
454
+
455
+ ::Thrift::Struct.generate_accessors self
456
+ end
457
+
458
+ class NestedSetInMapValue
459
+ include ::Thrift::Struct, ::Thrift::Struct_Union
460
+ VALUE = 1
461
+
462
+ FIELDS = {
463
+ VALUE => {:type => ::Thrift::Types::MAP, :name => 'value', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::SET, :element => {:type => ::Thrift::Types::BYTE}}}
464
+ }
465
+
466
+ def struct_fields; FIELDS; end
467
+
468
+ def validate
469
+ end
470
+
471
+ ::Thrift::Struct.generate_accessors self
472
+ end
473
+
474
+ class NestedMapInList
475
+ include ::Thrift::Struct, ::Thrift::Struct_Union
476
+ VALUE = 1
477
+
478
+ FIELDS = {
479
+ VALUE => {:type => ::Thrift::Types::LIST, :name => 'value', :element => {:type => ::Thrift::Types::MAP, :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::BYTE}}}
480
+ }
481
+
482
+ def struct_fields; FIELDS; end
483
+
484
+ def validate
485
+ end
486
+
487
+ ::Thrift::Struct.generate_accessors self
488
+ end
489
+
490
+ class NestedMapInSet
491
+ include ::Thrift::Struct, ::Thrift::Struct_Union
492
+ VALUE = 1
493
+
494
+ FIELDS = {
495
+ VALUE => {:type => ::Thrift::Types::SET, :name => 'value', :element => {:type => ::Thrift::Types::MAP, :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::BYTE}}}
496
+ }
497
+
498
+ def struct_fields; FIELDS; end
499
+
500
+ def validate
501
+ end
502
+
503
+ ::Thrift::Struct.generate_accessors self
504
+ end
505
+
506
+ class NestedMapInMapKey
507
+ include ::Thrift::Struct, ::Thrift::Struct_Union
508
+ VALUE = 2
509
+
510
+ FIELDS = {
511
+ VALUE => {:type => ::Thrift::Types::MAP, :name => 'value', :key => {:type => ::Thrift::Types::MAP, :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::BYTE}}, :value => {:type => ::Thrift::Types::BYTE}}
512
+ }
513
+
514
+ def struct_fields; FIELDS; end
515
+
516
+ def validate
517
+ end
518
+
519
+ ::Thrift::Struct.generate_accessors self
520
+ end
521
+
522
+ class NestedMapInMapValue
523
+ include ::Thrift::Struct, ::Thrift::Struct_Union
524
+ VALUE = 2
525
+
526
+ FIELDS = {
527
+ VALUE => {:type => ::Thrift::Types::MAP, :name => 'value', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::MAP, :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::BYTE}}}
528
+ }
529
+
530
+ def struct_fields; FIELDS; end
531
+
532
+ def validate
533
+ end
534
+
535
+ ::Thrift::Struct.generate_accessors self
536
+ end
537
+
346
538
  end
@@ -17,14 +17,13 @@
17
17
  # under the License.
18
18
  #
19
19
 
20
- require File.expand_path("#{File.dirname(__FILE__)}/spec_helper")
20
+ require 'spec_helper'
21
21
 
22
- class ThriftHTTPClientTransportSpec < Spec::ExampleGroup
23
- include Thrift
22
+ describe 'Thrift::HTTPClientTransport' do
24
23
 
25
- describe HTTPClientTransport do
24
+ describe Thrift::HTTPClientTransport do
26
25
  before(:each) do
27
- @client = HTTPClientTransport.new("http://my.domain.com/path/to/service?param=value")
26
+ @client = Thrift::HTTPClientTransport.new("http://my.domain.com/path/to/service?param=value")
28
27
  end
29
28
 
30
29
  it "should always be open" do
@@ -37,9 +36,13 @@ class ThriftHTTPClientTransportSpec < Spec::ExampleGroup
37
36
  @client.write "a test"
38
37
  @client.write " frame"
39
38
  Net::HTTP.should_receive(:new).with("my.domain.com", 80).and_return do
40
- mock("Net::HTTP").tee do |http|
39
+ mock("Net::HTTP").tap do |http|
41
40
  http.should_receive(:use_ssl=).with(false)
42
- http.should_receive(:post).with("/path/to/service?param=value", "a test frame", {"Content-Type"=>"application/x-thrift"}).and_return([nil, "data"])
41
+ http.should_receive(:post).with("/path/to/service?param=value", "a test frame", {"Content-Type"=>"application/x-thrift"}).and_return do
42
+ mock("Net::HTTPOK").tap do |response|
43
+ response.should_receive(:body).and_return "data"
44
+ end
45
+ end
43
46
  end
44
47
  end
45
48
  @client.flush
@@ -53,12 +56,65 @@ class ThriftHTTPClientTransportSpec < Spec::ExampleGroup
53
56
 
54
57
  @client.add_headers(custom_headers)
55
58
  Net::HTTP.should_receive(:new).with("my.domain.com", 80).and_return do
56
- mock("Net::HTTP").tee do |http|
59
+ mock("Net::HTTP").tap do |http|
57
60
  http.should_receive(:use_ssl=).with(false)
58
- http.should_receive(:post).with("/path/to/service?param=value", "test", headers).and_return([nil, "data"])
61
+ http.should_receive(:post).with("/path/to/service?param=value", "test", headers).and_return do
62
+ mock("Net::HTTPOK").tap do |response|
63
+ response.should_receive(:body).and_return "data"
64
+ end
65
+ end
59
66
  end
60
67
  end
61
68
  @client.flush
62
69
  end
63
70
  end
71
+
72
+ describe 'ssl enabled' do
73
+ before(:each) do
74
+ @service_path = "/path/to/service?param=value"
75
+ @server_uri = "https://my.domain.com"
76
+ end
77
+
78
+ it "should use SSL for https" do
79
+ client = Thrift::HTTPClientTransport.new("#{@server_uri}#{@service_path}")
80
+
81
+ client.write "test"
82
+
83
+ Net::HTTP.should_receive(:new).with("my.domain.com", 443).and_return do
84
+ mock("Net::HTTP").tap do |http|
85
+ http.should_receive(:use_ssl=).with(true)
86
+ http.should_receive(:verify_mode=).with(OpenSSL::SSL::VERIFY_PEER)
87
+ http.should_receive(:post).with(@service_path, "test",
88
+ "Content-Type" => "application/x-thrift").and_return do
89
+ mock("Net::HTTPOK").tap do |response|
90
+ response.should_receive(:body).and_return "data"
91
+ end
92
+ end
93
+ end
94
+ end
95
+ client.flush
96
+ client.read(4).should == "data"
97
+ end
98
+
99
+ it "should set SSL verify mode when specified" do
100
+ client = Thrift::HTTPClientTransport.new("#{@server_uri}#{@service_path}",
101
+ :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE)
102
+
103
+ client.write "test"
104
+ Net::HTTP.should_receive(:new).with("my.domain.com", 443).and_return do
105
+ mock("Net::HTTP").tap do |http|
106
+ http.should_receive(:use_ssl=).with(true)
107
+ http.should_receive(:verify_mode=).with(OpenSSL::SSL::VERIFY_NONE)
108
+ http.should_receive(:post).with(@service_path, "test",
109
+ "Content-Type" => "application/x-thrift").and_return do
110
+ mock("Net::HTTPOK").tap do |response|
111
+ response.should_receive(:body).and_return "data"
112
+ end
113
+ end
114
+ end
115
+ end
116
+ client.flush
117
+ client.read(4).should == "data"
118
+ end
119
+ end
64
120
  end