thrift 0.9.3.0 → 0.15.0

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 +7 -0
  2. data/ext/compact_protocol.c +1 -0
  3. data/ext/struct.c +14 -1
  4. data/ext/thrift_native.c +17 -0
  5. data/lib/thrift/processor.rb +10 -3
  6. data/lib/thrift/protocol/base_protocol.rb +11 -3
  7. data/lib/thrift/protocol/binary_protocol.rb +8 -1
  8. data/lib/thrift/protocol/binary_protocol_accelerated.rb +8 -0
  9. data/lib/thrift/protocol/compact_protocol.rb +8 -0
  10. data/lib/thrift/protocol/json_protocol.rb +21 -4
  11. data/lib/thrift/protocol/multiplexed_protocol.rb +5 -1
  12. data/lib/thrift/server/base_server.rb +8 -2
  13. data/lib/thrift/server/simple_server.rb +5 -1
  14. data/lib/thrift/server/thread_pool_server.rb +5 -1
  15. data/lib/thrift/server/threaded_server.rb +5 -1
  16. data/lib/thrift/transport/base_server_transport.rb +1 -1
  17. data/lib/thrift/transport/base_transport.rb +8 -0
  18. data/lib/thrift/transport/buffered_transport.rb +9 -1
  19. data/lib/thrift/transport/framed_transport.rb +9 -1
  20. data/lib/thrift/transport/http_client_transport.rb +7 -0
  21. data/lib/thrift/transport/io_stream_transport.rb +4 -1
  22. data/lib/thrift/transport/memory_buffer_transport.rb +4 -0
  23. data/lib/thrift/transport/server_socket.rb +6 -1
  24. data/lib/thrift/transport/socket.rb +21 -17
  25. data/lib/thrift/transport/ssl_server_socket.rb +41 -0
  26. data/lib/thrift/transport/ssl_socket.rb +51 -0
  27. data/lib/thrift/transport/unix_server_socket.rb +5 -1
  28. data/lib/thrift/transport/unix_socket.rb +5 -1
  29. data/lib/thrift.rb +6 -4
  30. data/spec/base_protocol_spec.rb +79 -71
  31. data/spec/base_transport_spec.rb +155 -117
  32. data/spec/binary_protocol_accelerated_spec.rb +6 -2
  33. data/spec/binary_protocol_spec.rb +16 -8
  34. data/spec/binary_protocol_spec_shared.rb +75 -72
  35. data/spec/bytes_spec.rb +38 -38
  36. data/spec/client_spec.rb +41 -42
  37. data/spec/compact_protocol_spec.rb +32 -17
  38. data/spec/exception_spec.rb +54 -54
  39. data/spec/flat_spec.rb +5 -5
  40. data/spec/http_client_spec.rb +74 -33
  41. data/spec/json_protocol_spec.rb +170 -131
  42. data/spec/namespaced_spec.rb +5 -5
  43. data/spec/nonblocking_server_spec.rb +16 -16
  44. data/spec/processor_spec.rb +26 -26
  45. data/spec/serializer_spec.rb +20 -20
  46. data/spec/server_socket_spec.rb +27 -22
  47. data/spec/server_spec.rb +91 -51
  48. data/spec/socket_spec.rb +23 -16
  49. data/spec/socket_spec_shared.rb +31 -31
  50. data/spec/spec_helper.rb +6 -1
  51. data/spec/ssl_server_socket_spec.rb +34 -0
  52. data/spec/ssl_socket_spec.rb +78 -0
  53. data/spec/struct_nested_containers_spec.rb +24 -24
  54. data/spec/struct_spec.rb +120 -120
  55. data/spec/thin_http_server_spec.rb +18 -18
  56. data/spec/types_spec.rb +56 -53
  57. data/spec/union_spec.rb +47 -41
  58. data/spec/unix_socket_spec.rb +43 -34
  59. metadata +198 -148
@@ -21,84 +21,84 @@ require 'spec_helper'
21
21
 
22
22
  shared_examples_for "a socket" do
23
23
  it "should open a socket" do
24
- @socket.open.should == @handle
24
+ expect(@socket.open).to eq(@handle)
25
25
  end
26
26
 
27
27
  it "should be open whenever it has a handle" do
28
- @socket.should_not be_open
28
+ expect(@socket).not_to be_open
29
29
  @socket.open
30
- @socket.should be_open
30
+ expect(@socket).to be_open
31
31
  @socket.handle = nil
32
- @socket.should_not be_open
32
+ expect(@socket).not_to be_open
33
33
  @socket.handle = @handle
34
34
  @socket.close
35
- @socket.should_not be_open
35
+ expect(@socket).not_to be_open
36
36
  end
37
37
 
38
38
  it "should write data to the handle" do
39
39
  @socket.open
40
- @handle.should_receive(:write).with("foobar")
40
+ expect(@handle).to receive(:write).with("foobar")
41
41
  @socket.write("foobar")
42
- @handle.should_receive(:write).with("fail").and_raise(StandardError)
43
- lambda { @socket.write("fail") }.should raise_error(Thrift::TransportException) { |e| e.type.should == Thrift::TransportException::NOT_OPEN }
42
+ expect(@handle).to receive(:write).with("fail").and_raise(StandardError)
43
+ expect { @socket.write("fail") }.to raise_error(Thrift::TransportException) { |e| expect(e.type).to eq(Thrift::TransportException::NOT_OPEN) }
44
44
  end
45
45
 
46
46
  it "should raise an error when it cannot read from the handle" do
47
47
  @socket.open
48
- @handle.should_receive(:readpartial).with(17).and_raise(StandardError)
49
- lambda { @socket.read(17) }.should raise_error(Thrift::TransportException) { |e| e.type.should == Thrift::TransportException::NOT_OPEN }
48
+ expect(@handle).to receive(:readpartial).with(17).and_raise(StandardError)
49
+ expect { @socket.read(17) }.to raise_error(Thrift::TransportException) { |e| expect(e.type).to eq(Thrift::TransportException::NOT_OPEN) }
50
50
  end
51
51
 
52
52
  it "should return the data read when reading from the handle works" do
53
53
  @socket.open
54
- @handle.should_receive(:readpartial).with(17).and_return("test data")
55
- @socket.read(17).should == "test data"
54
+ expect(@handle).to receive(:readpartial).with(17).and_return("test data")
55
+ expect(@socket.read(17)).to eq("test data")
56
56
  end
57
57
 
58
58
  it "should declare itself as closed when it has an error" do
59
59
  @socket.open
60
- @handle.should_receive(:write).with("fail").and_raise(StandardError)
61
- @socket.should be_open
62
- lambda { @socket.write("fail") }.should raise_error
63
- @socket.should_not be_open
60
+ expect(@handle).to receive(:write).with("fail").and_raise(StandardError)
61
+ expect(@socket).to be_open
62
+ expect { @socket.write("fail") }.to raise_error(Thrift::TransportException) { |e| expect(e.type).to eq(Thrift::TransportException::NOT_OPEN) }
63
+ expect(@socket).not_to be_open
64
64
  end
65
65
 
66
66
  it "should raise an error when the stream is closed" do
67
67
  @socket.open
68
- @handle.stub!(:closed?).and_return(true)
69
- @socket.should_not be_open
70
- lambda { @socket.write("fail") }.should raise_error(IOError, "closed stream")
71
- lambda { @socket.read(10) }.should raise_error(IOError, "closed stream")
68
+ allow(@handle).to receive(:closed?).and_return(true)
69
+ expect(@socket).not_to be_open
70
+ expect { @socket.write("fail") }.to raise_error(IOError, "closed stream")
71
+ expect { @socket.read(10) }.to raise_error(IOError, "closed stream")
72
72
  end
73
73
 
74
74
  it "should support the timeout accessor for read" do
75
75
  @socket.timeout = 3
76
76
  @socket.open
77
- IO.should_receive(:select).with([@handle], nil, nil, 3).and_return([[@handle], [], []])
78
- @handle.should_receive(:readpartial).with(17).and_return("test data")
79
- @socket.read(17).should == "test data"
77
+ expect(IO).to receive(:select).with([@handle], nil, nil, 3).and_return([[@handle], [], []])
78
+ expect(@handle).to receive(:readpartial).with(17).and_return("test data")
79
+ expect(@socket.read(17)).to eq("test data")
80
80
  end
81
81
 
82
82
  it "should support the timeout accessor for write" do
83
83
  @socket.timeout = 3
84
84
  @socket.open
85
- IO.should_receive(:select).with(nil, [@handle], nil, 3).twice.and_return([[], [@handle], []])
86
- @handle.should_receive(:write_nonblock).with("test data").and_return(4)
87
- @handle.should_receive(:write_nonblock).with(" data").and_return(5)
88
- @socket.write("test data").should == 9
85
+ expect(IO).to receive(:select).with(nil, [@handle], nil, 3).twice.and_return([[], [@handle], []])
86
+ expect(@handle).to receive(:write_nonblock).with("test data").and_return(4)
87
+ expect(@handle).to receive(:write_nonblock).with(" data").and_return(5)
88
+ expect(@socket.write("test data")).to eq(9)
89
89
  end
90
90
 
91
91
  it "should raise an error when read times out" do
92
92
  @socket.timeout = 0.5
93
93
  @socket.open
94
- IO.should_receive(:select).once {sleep(0.5); nil}
95
- lambda { @socket.read(17) }.should raise_error(Thrift::TransportException) { |e| e.type.should == Thrift::TransportException::TIMED_OUT }
94
+ expect(IO).to receive(:select).once {sleep(0.5); nil}
95
+ expect { @socket.read(17) }.to raise_error(Thrift::TransportException) { |e| expect(e.type).to eq(Thrift::TransportException::TIMED_OUT) }
96
96
  end
97
97
 
98
98
  it "should raise an error when write times out" do
99
99
  @socket.timeout = 0.5
100
100
  @socket.open
101
- IO.should_receive(:select).with(nil, [@handle], nil, 0.5).any_number_of_times.and_return(nil)
102
- lambda { @socket.write("test data") }.should raise_error(Thrift::TransportException) { |e| e.type.should == Thrift::TransportException::TIMED_OUT }
101
+ allow(IO).to receive(:select).with(nil, [@handle], nil, 0.5).and_return(nil)
102
+ expect { @socket.write("test data") }.to raise_error(Thrift::TransportException) { |e| expect(e.type).to eq(Thrift::TransportException::TIMED_OUT) }
103
103
  end
104
104
  end
data/spec/spec_helper.rb CHANGED
@@ -54,7 +54,7 @@ require 'thrift_spec_types'
54
54
  require 'nonblocking_service'
55
55
 
56
56
  module Fixtures
57
- COMPACT_PROTOCOL_TEST_STRUCT = COMPACT_TEST.dup
57
+ COMPACT_PROTOCOL_TEST_STRUCT = Thrift::Test::COMPACT_TEST.dup
58
58
  COMPACT_PROTOCOL_TEST_STRUCT.a_binary = [0,1,2,3,4,5,6,7,8].pack('c*')
59
59
  COMPACT_PROTOCOL_TEST_STRUCT.set_byte_map = nil
60
60
  COMPACT_PROTOCOL_TEST_STRUCT.map_byte_map = nil
@@ -62,3 +62,8 @@ end
62
62
 
63
63
  $:.unshift File.join(File.dirname(__FILE__), *%w[gen-rb/flat])
64
64
 
65
+ if defined?(GC.verify_compaction_references) == 'method'
66
+ # This method was added in Ruby 3.0.0. Calling it this way asks the GC to
67
+ # move objects around, helping to find object movement bugs.
68
+ GC.verify_compaction_references(double_heap: true, toward: :empty)
69
+ end
@@ -0,0 +1,34 @@
1
+ #
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
+
20
+ require 'spec_helper'
21
+ require File.expand_path("#{File.dirname(__FILE__)}/socket_spec_shared")
22
+
23
+ describe 'SSLServerSocket' do
24
+
25
+ describe Thrift::SSLServerSocket do
26
+ before(:each) do
27
+ @socket = Thrift::SSLServerSocket.new(1234)
28
+ end
29
+
30
+ it "should provide a reasonable to_s" do
31
+ expect(@socket.to_s).to eq("ssl(socket(:1234))")
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,78 @@
1
+ #
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
+
20
+ require 'spec_helper'
21
+ require File.expand_path("#{File.dirname(__FILE__)}/socket_spec_shared")
22
+
23
+ describe 'SSLSocket' do
24
+
25
+ describe Thrift::SSLSocket do
26
+ before(:each) do
27
+ @context = OpenSSL::SSL::SSLContext.new
28
+ @socket = Thrift::SSLSocket.new
29
+ @simple_socket_handle = double("Handle", :closed? => false)
30
+ allow(@simple_socket_handle).to receive(:close)
31
+ allow(@simple_socket_handle).to receive(:connect_nonblock)
32
+ allow(@simple_socket_handle).to receive(:setsockopt)
33
+
34
+ @handle = double(double("SSLHandle", :connect_nonblock => true, :post_connection_check => true), :closed? => false)
35
+ allow(@handle).to receive(:connect_nonblock)
36
+ allow(@handle).to receive(:close)
37
+ allow(@handle).to receive(:post_connection_check)
38
+
39
+ allow(::Socket).to receive(:new).and_return(@simple_socket_handle)
40
+ allow(OpenSSL::SSL::SSLSocket).to receive(:new).and_return(@handle)
41
+ end
42
+
43
+ it_should_behave_like "a socket"
44
+
45
+ it "should raise a TransportException when it cannot open a ssl socket" do
46
+ expect(::Socket).to receive(:getaddrinfo).with("localhost", 9090, nil, ::Socket::SOCK_STREAM).and_return([[]])
47
+ expect { @socket.open }.to raise_error(Thrift::TransportException) { |e| expect(e.type).to eq(Thrift::TransportException::NOT_OPEN) }
48
+ end
49
+
50
+ it "should open a ::Socket with default args" do
51
+ expect(OpenSSL::SSL::SSLSocket).to receive(:new).with(@simple_socket_handle, nil).and_return(@handle)
52
+ expect(@handle).to receive(:post_connection_check).with('localhost')
53
+ @socket.open
54
+ end
55
+
56
+ it "should accept host/port options" do
57
+ handle = double("Handle", :connect_nonblock => true, :setsockopt => nil)
58
+ allow(::Socket).to receive(:new).and_return(handle)
59
+ expect(::Socket).to receive(:getaddrinfo).with("my.domain", 1234, nil, ::Socket::SOCK_STREAM).and_return([[]])
60
+ expect(::Socket).to receive(:sockaddr_in)
61
+ expect(OpenSSL::SSL::SSLSocket).to receive(:new).with(handle, nil).and_return(@handle)
62
+ expect(@handle).to receive(:post_connection_check).with('my.domain')
63
+ Thrift::SSLSocket.new('my.domain', 1234, 6000, nil).open
64
+ end
65
+
66
+ it "should accept an optional timeout" do
67
+ expect(Thrift::SSLSocket.new('localhost', 8080, 5).timeout).to eq(5)
68
+ end
69
+
70
+ it "should accept an optional context" do
71
+ expect(Thrift::SSLSocket.new('localhost', 8080, 5, @context).ssl_context).to eq(@context)
72
+ end
73
+
74
+ it "should provide a reasonable to_s" do
75
+ expect(Thrift::SSLSocket.new('myhost', 8090).to_s).to eq("ssl(socket(myhost:8090))")
76
+ end
77
+ end
78
+ end
@@ -39,9 +39,9 @@ describe 'StructNestedContainers' do
39
39
  thrift_struct.value = [ [1, 2, 3], [2, 3, 4] ]
40
40
  thrift_struct.validate
41
41
  end
42
- a.should == b
42
+ expect(a).to eq(b)
43
43
  b.value.push [3, 4, 5]
44
- a.should_not == b
44
+ expect(a).not_to eq(b)
45
45
  end
46
46
  end
47
47
 
@@ -52,9 +52,9 @@ describe 'StructNestedContainers' do
52
52
  thrift_struct.value = [ [1, 2, 3], [2, 3, 4] ].to_set
53
53
  thrift_struct.validate
54
54
  end
55
- a.should == b
55
+ expect(a).to eq(b)
56
56
  b.value.add [3, 4, 5]
57
- a.should_not == b
57
+ expect(a).not_to eq(b)
58
58
  end
59
59
  end
60
60
 
@@ -65,9 +65,9 @@ describe 'StructNestedContainers' do
65
65
  thrift_struct.value = { [1, 2, 3] => 1, [2, 3, 4] => 2 }
66
66
  thrift_struct.validate
67
67
  end
68
- a.should == b
68
+ expect(a).to eq(b)
69
69
  b.value[[3, 4, 5]] = 3
70
- a.should_not == b
70
+ expect(a).not_to eq(b)
71
71
  end
72
72
  end
73
73
 
@@ -78,9 +78,9 @@ describe 'StructNestedContainers' do
78
78
  thrift_struct.value = { 1 => [1, 2, 3], 2 => [2, 3, 4] }
79
79
  thrift_struct.validate
80
80
  end
81
- a.should == b
81
+ expect(a).to eq(b)
82
82
  b.value[3] = [3, 4, 5]
83
- a.should_not == b
83
+ expect(a).not_to eq(b)
84
84
  end
85
85
  end
86
86
 
@@ -91,9 +91,9 @@ describe 'StructNestedContainers' do
91
91
  thrift_struct.value = [ [1, 2, 3].to_set, [2, 3, 4].to_set ]
92
92
  thrift_struct.validate
93
93
  end
94
- a.should == b
94
+ expect(a).to eq(b)
95
95
  b.value.push([3, 4, 5].to_set)
96
- a.should_not == b
96
+ expect(a).not_to eq(b)
97
97
  end
98
98
  end
99
99
 
@@ -104,9 +104,9 @@ describe 'StructNestedContainers' do
104
104
  thrift_struct.value = [ [1, 2, 3].to_set, [2, 3, 4].to_set ].to_set
105
105
  thrift_struct.validate
106
106
  end
107
- a.should == b
107
+ expect(a).to eq(b)
108
108
  b.value.add([3, 4, 5].to_set)
109
- a.should_not == b
109
+ expect(a).not_to eq(b)
110
110
  end
111
111
  end
112
112
 
@@ -117,9 +117,9 @@ describe 'StructNestedContainers' do
117
117
  thrift_struct.value = { [1, 2, 3].to_set => 1, [2, 3, 4].to_set => 2 }
118
118
  thrift_struct.validate
119
119
  end
120
- a.should == b
120
+ expect(a).to eq(b)
121
121
  b.value[[3, 4, 5].to_set] = 3
122
- a.should_not == b
122
+ expect(a).not_to eq(b)
123
123
  end
124
124
  end
125
125
 
@@ -130,9 +130,9 @@ describe 'StructNestedContainers' do
130
130
  thrift_struct.value = { 1 => [1, 2, 3].to_set, 2 => [2, 3, 4].to_set }
131
131
  thrift_struct.validate
132
132
  end
133
- a.should == b
133
+ expect(a).to eq(b)
134
134
  b.value[3] = [3, 4, 5].to_set
135
- a.should_not == b
135
+ expect(a).not_to eq(b)
136
136
  end
137
137
  end
138
138
 
@@ -143,9 +143,9 @@ describe 'StructNestedContainers' do
143
143
  thrift_struct.value = [ {1 => 2, 3 => 4}, {2 => 3, 4 => 5} ]
144
144
  thrift_struct.validate
145
145
  end
146
- a.should == b
146
+ expect(a).to eq(b)
147
147
  b.value.push({ 3 => 4, 5 => 6 })
148
- a.should_not == b
148
+ expect(a).not_to eq(b)
149
149
  end
150
150
  end
151
151
 
@@ -156,9 +156,9 @@ describe 'StructNestedContainers' do
156
156
  thrift_struct.value = [ {1 => 2, 3 => 4}, {2 => 3, 4 => 5} ].to_set
157
157
  thrift_struct.validate
158
158
  end
159
- a.should == b
159
+ expect(a).to eq(b)
160
160
  b.value.add({ 3 => 4, 5 => 6 })
161
- a.should_not == b
161
+ expect(a).not_to eq(b)
162
162
  end
163
163
  end
164
164
 
@@ -169,9 +169,9 @@ describe 'StructNestedContainers' do
169
169
  thrift_struct.value = { { 1 => 2, 3 => 4} => 1, {2 => 3, 4 => 5} => 2 }
170
170
  thrift_struct.validate
171
171
  end
172
- a.should == b
172
+ expect(a).to eq(b)
173
173
  b.value[{3 => 4, 5 => 6}] = 3
174
- a.should_not == b
174
+ expect(a).not_to eq(b)
175
175
  end
176
176
  end
177
177
 
@@ -182,9 +182,9 @@ describe 'StructNestedContainers' do
182
182
  thrift_struct.value = { 1 => { 1 => 2, 3 => 4}, 2 => {2 => 3, 4 => 5} }
183
183
  thrift_struct.validate
184
184
  end
185
- a.should == b
185
+ expect(a).to eq(b)
186
186
  b.value[3] = { 3 => 4, 5 => 6 }
187
- a.should_not == b
187
+ expect(a).not_to eq(b)
188
188
  end
189
189
  end
190
190
  end