RaymondChou-thrift_client 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,44 @@
1
+ module Greeter
2
+ class Handler
3
+ def greeting(name)
4
+ "hello there #{name}!"
5
+ end
6
+
7
+ def yo(name)
8
+ #whee
9
+ end
10
+ end
11
+
12
+ class Server
13
+ def initialize(port)
14
+ @port = port
15
+ handler = Greeter::Handler.new
16
+ processor = Greeter::Processor.new(handler)
17
+ transport = Thrift::ServerSocket.new("127.0.0.1", port)
18
+ transportFactory = Thrift::FramedTransportFactory.new()
19
+ @server = Thrift::SimpleServer.new(processor, transport, transportFactory)
20
+ end
21
+
22
+ def serve
23
+ @server.serve()
24
+ end
25
+ end
26
+
27
+ # client:
28
+ # trans = Thrift::HTTPClientTransport.new("http://127.0.0.1:9292/greeter")
29
+ # prot = Thrift::BinaryProtocol.new(trans)
30
+ # c = Greeter::Client.new(prot)
31
+ class HTTPServer
32
+ def initialize(uri)
33
+ uri = URI.parse(uri)
34
+ handler = Greeter::Handler.new
35
+ processor = Greeter::Processor.new(handler)
36
+ path = uri.path
37
+ @server = Thrift::ThinHTTPServer.new(processor, :port => uri.port, :ip => uri.host, :path => path)
38
+ end
39
+
40
+ def serve
41
+ @server.serve()
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,112 @@
1
+ require File.expand_path('test_helper.rb', File.dirname(__FILE__))
2
+
3
+ class MultipleWorkingServersTest < Test::Unit::TestCase
4
+ def setup
5
+ @servers = ["127.0.0.1:1461", "127.0.0.1:1462", "127.0.0.1:1463"]
6
+ @socket = 1461
7
+ @timeout = 0.2
8
+ @options = {:protocol_extra_params => [false]}
9
+ @pids = []
10
+ @servers.each do |s|
11
+ @pids << Process.fork do
12
+ Signal.trap("INT") { exit }
13
+ Greeter::Server.new(s.split(':').last).serve
14
+ end
15
+ end
16
+ # Need to give the child process a moment to open the listening socket or
17
+ # we get occasional "could not connect" errors in tests.
18
+ sleep 0.05
19
+ end
20
+
21
+ def teardown
22
+ @pids.each do |pid|
23
+ Process.kill("INT", pid)
24
+ Process.wait(pid)
25
+ end
26
+ end
27
+
28
+ def test_server_creates_new_client_that_can_talk_to_all_servers_after_disconnect
29
+ client = ThriftClient.new(Greeter::Client, @servers, @options)
30
+ client.greeting("someone")
31
+ last_client = client.last_client
32
+ client.greeting("someone")
33
+ assert_equal last_client, client.last_client # Sanity check
34
+
35
+ client.disconnect!
36
+ client.greeting("someone")
37
+ last_client = client.last_client
38
+ client.greeting("someone")
39
+ assert_equal last_client, client.last_client
40
+ last_client = client.last_client
41
+ client.greeting("someone")
42
+ assert_equal last_client, client.last_client
43
+
44
+ # Moves on to the second server
45
+ assert_nothing_raised {
46
+ client.greeting("someone")
47
+ client.greeting("someone")
48
+ }
49
+ end
50
+
51
+ def test_server_doesnt_max_out_after_explicit_disconnect
52
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:server_max_requests => 2))
53
+ client.greeting("someone")
54
+ last_client = client.last_client
55
+ client.greeting("someone")
56
+ assert_equal last_client, client.last_client # Sanity check
57
+
58
+ client.disconnect!
59
+
60
+ client.greeting("someone")
61
+ last_client = client.last_client
62
+ client.greeting("someone")
63
+ assert_equal last_client, client.last_client, "ThriftClient should not have reset the internal client if the counter was reset on disconnect"
64
+ end
65
+
66
+ def test_server_disconnect_doesnt_drop_servers_with_retry_period
67
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:server_max_requests => 2, :retry_period => 1))
68
+ 3.times {
69
+ client.greeting("someone")
70
+ last_client = client.last_client
71
+ client.greeting("someone")
72
+ assert_equal last_client, client.last_client # Sanity check
73
+
74
+ client.disconnect!
75
+
76
+ client.greeting("someone")
77
+ last_client = client.last_client
78
+ client.greeting("someone")
79
+ assert_equal last_client, client.last_client, "ThriftClient should not have reset the internal client if the counter was reset on disconnect"
80
+ }
81
+ end
82
+
83
+
84
+ def test_server_max_requests
85
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:server_max_requests => 2))
86
+
87
+ client.greeting("someone")
88
+ last_client = client.last_client
89
+
90
+ client.greeting("someone")
91
+ assert_equal last_client, client.last_client
92
+
93
+ # This next call maxes out the requests for that "client" object
94
+ # and moves on to the next.
95
+ client.greeting("someone")
96
+ assert_not_equal last_client, new_client = client.last_client
97
+
98
+ # And here we should still have the same client as the last one...
99
+ client.greeting("someone")
100
+ assert_equal new_client, client.last_client
101
+
102
+ # Until we max it out, too.
103
+ client.greeting("someone")
104
+ assert_not_equal new_client, client.last_client
105
+ assert_not_nil client.last_client
106
+
107
+ new_new_client = client.last_client
108
+ # And we should still have one server left
109
+ client.greeting("someone")
110
+ assert_equal new_new_client, client.last_client
111
+ end
112
+ end
@@ -0,0 +1,136 @@
1
+ require File.expand_path('test_helper.rb', File.dirname(__FILE__))
2
+
3
+ class SimpleTest < Test::Unit::TestCase
4
+
5
+ S = ThriftClient::Simple
6
+ S.make_struct("Example", S::Field.new(:name, S::STRING, 1))
7
+ S.make_struct("Args")
8
+ S.make_struct("Retval", S::Field.new(:rv, S::I32, 0))
9
+
10
+ def test_definition
11
+ assert Struct::ST_Example
12
+ assert Struct::ST_Args
13
+ assert Struct::ST_Retval
14
+ end
15
+
16
+ ## Encoding
17
+
18
+ def test_boolean_encoding
19
+ assert_equal "\001", S.pack_value(S::BOOL, true)
20
+ assert_equal "\000", S.pack_value(S::BOOL, false)
21
+ end
22
+
23
+ def test_byte_encoding
24
+ assert_equal "\xc7", S.pack_value(S::BYTE, 199)
25
+ end
26
+
27
+ def test_i16_encoding
28
+ assert_equal "\x00\x96", S.pack_value(S::I16, 150)
29
+ end
30
+
31
+ def test_i32_encoding
32
+ assert_equal "\x00\x96\xb4\x3f", S.pack_value(S::I32, 9876543)
33
+ end
34
+
35
+ def test_i64_encoding
36
+ assert_equal "\x00\x00\x00\x1c\xbb\xf3\x09\x04", S.pack_value(S::I64, 123412351236)
37
+ end
38
+
39
+ def test_double_encoding
40
+ assert_equal "\x40\x23\x00\x00\x00\x00\x00\x00", S.pack_value(S::DOUBLE, 9.5)
41
+ end
42
+
43
+ def test_string_encoding
44
+ assert_equal "\x00\x00\x00\x05hello", S.pack_value(S::STRING, "hello")
45
+ end
46
+
47
+ def test_list_encoding
48
+ assert_equal "\x08\x00\x00\x00\x03\x00\x00\x00\x17\x00\x00\x00\x16\x00\x00\x00\x15",
49
+ S.pack_value(S::ListType.new(S::I32), [ 23, 22, 21 ])
50
+ end
51
+
52
+ def test_map_encoding
53
+ assert_equal "\x0b\x08\x00\x00\x00\x01\x00\x00\x00\x03cat\x00\x00\x00\x05",
54
+ S.pack_value(S::MapType.new(S::STRING, S::I32), "cat" => 5)
55
+ end
56
+
57
+ def test_set_encoding
58
+ assert_equal "\x08\x00\x00\x00\x01\x00\x00\x00\x04",
59
+ S.pack_value(S::SetType.new(S::I32), [ 4 ])
60
+ end
61
+
62
+ def test_struct_encoding
63
+ assert_equal "\x0b\x00\x01\x00\x00\x00\x06Commie\x00",
64
+ S.pack_value(S::StructType.new(Struct::ST_Example), Struct::ST_Example.new("Commie"))
65
+ end
66
+
67
+ def test_request_encoding
68
+ assert_equal "\x80\x01\x00\x01\x00\x00\x00\x09getHeight\x00\x00\x00\x17\x00",
69
+ S.pack_request("getHeight", Struct::ST_Args.new, 23)
70
+ end
71
+
72
+ ## Decoding
73
+
74
+ def test_boolean_decoding
75
+ assert_equal true, S.read_value(StringIO.new("\x01"), S::BOOL)
76
+ assert_equal false, S.read_value(StringIO.new("\x00"), S::BOOL)
77
+ end
78
+
79
+ def test_byte_decoding
80
+ assert_equal -57, S.read_value(StringIO.new("\xc7"), S::BYTE)
81
+ end
82
+
83
+ def test_i16_decoding
84
+ assert_equal 150, S.read_value(StringIO.new("\x00\x96"), S::I16)
85
+ end
86
+
87
+ def test_i32_decoding
88
+ assert_equal 9876543, S.read_value(StringIO.new("\x00\x96\xb4\x3f"), S::I32)
89
+ end
90
+
91
+ def test_i64_decoding
92
+ assert_equal 123412351236,
93
+ S.read_value(StringIO.new("\x00\x00\x00\x1c\xbb\xf3\x09\x04"), S::I64)
94
+ end
95
+
96
+ def test_double_decoding
97
+ assert_equal 9.5,
98
+ S.read_value(StringIO.new("\x40\x23\x00\x00\x00\x00\x00\x00"), S::DOUBLE)
99
+ end
100
+
101
+ def test_string_decoding
102
+ assert_equal "hello", S.read_value(StringIO.new("\x00\x00\x00\x05hello"), S::STRING)
103
+ end
104
+
105
+ def test_list_decoding
106
+ assert_equal [ 23, 22, 21 ],
107
+ S.read_value(StringIO.new("\x08\x00\x00\x00\x03\x00\x00\x00\x17\x00\x00\x00\x16\x00\x00\x00\x15"),
108
+ S::ListType.new(S::I32))
109
+ end
110
+
111
+ def test_map_decoding
112
+ assert_equal({ "cat" => 5 },
113
+ S.read_value(StringIO.new("\x0b\x08\x00\x00\x00\x01\x00\x00\x00\x03cat\x00\x00\x00\x05"),
114
+ S::MapType.new(S::STRING, S::I32)))
115
+ end
116
+
117
+ def test_set_decoding
118
+ assert_equal [ 4 ],
119
+ S.read_value(StringIO.new("\x08\x00\x00\x00\x01\x00\x00\x00\x04"),
120
+ S::ListType.new(S::I32))
121
+ end
122
+
123
+ def test_struct_decoding
124
+ assert_equal Struct::ST_Example.new("Commie"),
125
+ S.read_value(StringIO.new("\x0b\x00\x01\x00\x00\x00\x06Commie\x00"),
126
+ S::StructType.new(Struct::ST_Example))
127
+ end
128
+
129
+ def test_response_decoding
130
+ assert_equal [ "getHeight", 255, 1 ],
131
+ S.read_response(
132
+ StringIO.new("\x80\x01\x00\x02\x00\x00\x00\x09getHeight\x00\x00\x00\xff\x08\x00\x00\x00\x00\x00\x01\x00"),
133
+ Struct::ST_Retval)
134
+ end
135
+
136
+ end
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'benchmark'
4
+ $LOAD_PATH << "#{File.expand_path(File.dirname(__FILE__))}/../lib"
5
+ require 'thrift_client'
6
+ require 'thrift_client/simple'
7
+
8
+ $LOAD_PATH << File.expand_path(File.dirname(__FILE__))
9
+ require 'greeter/greeter'
10
+ require 'greeter/server'
11
+
12
+ begin; require 'ruby-debug'; rescue LoadError; end
@@ -0,0 +1,45 @@
1
+ require File.expand_path('test_helper.rb', File.dirname(__FILE__))
2
+
3
+ class ThriftClientHTTPTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @servers = ["http://127.0.0.1:1461/greeter", "http://127.0.0.1:1462/greeter", "http://127.0.0.1:1463/greeter"]
7
+ @socket = 1461
8
+ @timeout = 0.2
9
+ @options = {:protocol_extra_params => [false]}
10
+ @pid = Process.fork do
11
+ Signal.trap("INT") { exit }
12
+ Greeter::HTTPServer.new(@servers.last).serve
13
+ end
14
+ # Need to give the child process a moment to open the listening socket or
15
+ # we get occasional "could not connect" errors in tests.
16
+ sleep 0.20
17
+ end
18
+
19
+ def teardown
20
+ Process.kill("INT", @pid)
21
+ Process.wait
22
+ end
23
+
24
+ def test_bad_uri
25
+ assert_raises URI::InvalidURIError do
26
+ @options.merge!({ :protocol => Thrift::BinaryProtocol, :transport => Thrift::HTTPClientTransport })
27
+ ThriftClient.new(Greeter::Client, "127.0.0.1:1463", @options).greeting("someone")
28
+ end
29
+ end
30
+
31
+ def test_bad_uri_no_http
32
+ assert_raises ArgumentError do
33
+ @options.merge!({ :protocol => Thrift::BinaryProtocol, :transport => Thrift::HTTPClientTransport })
34
+ ThriftClient.new(Greeter::Client, "//127.0.0.1:1463", @options).greeting("someone")
35
+ end
36
+ end
37
+
38
+ def test_valid_server
39
+ assert_nothing_raised do
40
+ @options.merge!({ :protocol => Thrift::BinaryProtocol, :transport => Thrift::HTTPClientTransport })
41
+ ThriftClient.new(Greeter::Client, "http://127.0.0.1:1463/greeter", @options).greeting("someone")
42
+ end
43
+ end
44
+
45
+ end
@@ -0,0 +1,289 @@
1
+ require File.expand_path('test_helper.rb', File.dirname(__FILE__))
2
+
3
+ class ThriftClientTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @servers = ["127.0.0.1:1461", "127.0.0.1:1462", "127.0.0.1:1463"]
7
+ @port = 1461
8
+ @timeout = 0.2
9
+ @options = {:protocol_extra_params => [false]}
10
+ @pid = Process.fork do
11
+ Signal.trap("INT") { exit }
12
+ Greeter::Server.new("1463").serve
13
+ end
14
+ # Need to give the child process a moment to open the listening socket or
15
+ # we get occasional "could not connect" errors in tests.
16
+ sleep 0.05
17
+ end
18
+
19
+ def teardown
20
+ Process.kill("INT", @pid)
21
+ Process.wait
22
+ end
23
+
24
+ def test_inspect
25
+ client = ThriftClient.new(Greeter::Client, @servers.last, @options)
26
+ assert_equal "<ThriftClient(Greeter::Client) @current_server=127.0.0.1:1463>", client.inspect
27
+ end
28
+
29
+ def test_create_wrapped_exception_classes
30
+ client = Module.new
31
+ ThriftClient.create_wrapped_exception_classes(client, [Thrift::TransportException])
32
+ assert client.const_defined?(:TransportException)
33
+ assert client.const_get(:TransportException).new.is_a?(Thrift::TransportException)
34
+ end
35
+
36
+ def test_live_server
37
+ assert_nothing_raised do
38
+ ThriftClient.new(Greeter::Client, @servers.last, @options).greeting("someone")
39
+ end
40
+ end
41
+
42
+ def test_dont_raise
43
+ assert_nothing_raised do
44
+ ThriftClient.new(Greeter::Client, @servers.first, @options.merge(:raise => false)).greeting("someone")
45
+ end
46
+ end
47
+
48
+ def test_retries_correct_number_of_times
49
+ stub_server(@port) do |socket|
50
+ opts = @options.merge(:timeout => @timeout, :retries => 4, :server_retry_period => nil)
51
+ client = ThriftClient.new(Greeter::Client, "127.0.0.1:#{@port}", opts)
52
+ times_called = 0
53
+
54
+ singleton_class = (class << client; self end)
55
+
56
+ # disconnect_on_error! is called every time a server related
57
+ # connection error happens. it will be called every try (so, retries + 1)
58
+ singleton_class.send :define_method, :disconnect! do |*args|
59
+ times_called += 1 if args[0]; super *args
60
+ end
61
+
62
+ assert_raises(Greeter::Client::TransportException) { client.greeting("someone") }
63
+ assert_equal opts[:retries] + 1, times_called
64
+ end
65
+ end
66
+
67
+ def test_dont_raise_with_defaults
68
+ client = ThriftClient.new(Greeter::Client, @servers.first, @options.merge(:raise => false, :defaults => {:greeting => 1}))
69
+ assert_equal 1, client.greeting
70
+ end
71
+
72
+ def test_defaults_dont_override_no_method_error
73
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:raise => false, :defaults => {:Missing => 2}))
74
+ assert_raises(NoMethodError) { client.Missing }
75
+ end
76
+
77
+ def test_random_fall_through
78
+ assert_nothing_raised do
79
+ 10.times do
80
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:retries => 2))
81
+ client.greeting("someone")
82
+ client.disconnect!
83
+ end
84
+ end
85
+ end
86
+
87
+ def test_lazy_connection
88
+ assert_nothing_raised do
89
+ ThriftClient.new(Greeter::Client, @servers[0,2])
90
+ end
91
+ end
92
+
93
+ def test_post_conn_cb
94
+ calledcnt = 0
95
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:retries => 2))
96
+ r = client.add_callback :post_connect do |cl|
97
+ calledcnt += 1
98
+ assert_equal(client, cl)
99
+ end
100
+ assert_equal(client, r)
101
+ assert_nothing_raised do
102
+ client.greeting("someone")
103
+ client.disconnect!
104
+ end
105
+ assert_equal(1, calledcnt)
106
+ end
107
+
108
+ def test_before_method_cb
109
+ before_method_counts = Hash.new { |hash, key| hash[key] = 0 }
110
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:retries => 2))
111
+ r = client.add_callback :before_method do |method_name|
112
+ before_method_counts[method_name.to_sym] += 1
113
+ end
114
+ assert_equal(client, r)
115
+ assert_nothing_raised do
116
+ client.greeting("someone")
117
+ client.yo("dude")
118
+ client.yo("dawg")
119
+ client.disconnect!
120
+ end
121
+ assert_equal({:greeting => 1, :yo => 2}, before_method_counts)
122
+ end
123
+
124
+ def test_on_exception_cb
125
+ on_exception_counts = Hash.new { |h1, method_name| h1[method_name] = Hash.new { |h2, clazz| h2[clazz] = 0 }}
126
+ client = ThriftClient.new(Greeter::Client, @servers[0,2], @options.merge(:retries => 2))
127
+ r = client.add_callback :on_exception do |error, method_name|
128
+ on_exception_counts[method_name.to_sym][error.class] += 1
129
+ end
130
+ assert_equal(client, r)
131
+ assert_raises(ThriftClient::NoServersAvailable) do
132
+ client.greeting("someone")
133
+ client.disconnect!
134
+ end
135
+ assert_equal({:greeting => {ThriftClient::NoServersAvailable => 1}}, on_exception_counts)
136
+ end
137
+
138
+ def test_unknown_cb
139
+ calledcnt = 0
140
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:retries => 2))
141
+ r = client.add_callback :unknown do |cl|
142
+ assert(false)
143
+ end
144
+ assert_equal(nil, r)
145
+ end
146
+
147
+ def test_multiple_cb
148
+ calledcnt = 0
149
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:retries => 2))
150
+ 2.times do |i|
151
+ r = client.add_callback :post_connect do |cl|
152
+ calledcnt += 1
153
+ assert_equal(client, cl)
154
+ end
155
+ assert_equal(client, r)
156
+ end
157
+ assert_nothing_raised do
158
+ client.greeting("someone")
159
+ client.disconnect!
160
+ end
161
+ assert_equal(2, calledcnt)
162
+ end
163
+
164
+ def test_no_servers_eventually_raise
165
+ wascalled = false
166
+ client = ThriftClient.new(Greeter::Client, @servers[0,2], @options.merge(:retries => 2))
167
+ client.add_callback :post_connect do
168
+ wascalled = true
169
+ end
170
+ assert_raises(ThriftClient::NoServersAvailable) do
171
+ client.greeting("someone")
172
+ client.disconnect!
173
+ end
174
+ assert(!wascalled)
175
+ end
176
+
177
+ def test_socket_timeout
178
+ stub_server(@port) do |socket|
179
+ measurement = Benchmark.measure do
180
+ assert_raises(Greeter::Client::TransportException) do
181
+ ThriftClient.new(Greeter::Client, "127.0.0.1:#{@port}",
182
+ @options.merge(:timeout => 1, :connect_timeout => 0.5)
183
+ ).greeting("someone")
184
+ end
185
+ end
186
+ assert(measurement.real > 0.5 && measurement.real < 1.05)
187
+ end
188
+ end
189
+
190
+ def test_framed_transport_timeout
191
+ stub_server(@port) do |socket|
192
+ measurement = Benchmark.measure do
193
+ assert_raises(Greeter::Client::TransportException) do
194
+ ThriftClient.new(Greeter::Client, "127.0.0.1:#{@port}",
195
+ @options.merge(:timeout => @timeout, :connect_timeout => @timeout)
196
+ ).greeting("someone")
197
+ end
198
+ end
199
+ assert((measurement.real > @timeout), "#{measurement.real} < #{@timeout}")
200
+ end
201
+ end
202
+
203
+ def test_buffered_transport_timeout
204
+ stub_server(@port) do |socket|
205
+ measurement = Benchmark.measure do
206
+ client = ThriftClient.new(Greeter::Client, "127.0.0.1:#{@port}",
207
+ @options.merge(:timeout => @timeout, :transport_wrapper => Thrift::BufferedTransport, :connect_timeout => @timeout)
208
+ )
209
+ assert_raises(Greeter::Client::TransportException) do
210
+ client.greeting("someone")
211
+ end
212
+ end
213
+ assert((measurement.real > @timeout), "#{measurement.real} < #{@timeout}")
214
+ end
215
+ end
216
+
217
+ def test_buffered_transport_timeout_override
218
+ # FIXME Large timeout values always are applied twice for some bizarre reason
219
+ log_timeout = @timeout * 4
220
+ stub_server(@port) do |socket|
221
+ measurement = Benchmark.measure do
222
+ client = ThriftClient.new(Greeter::Client, "127.0.0.1:#{@port}",
223
+ @options.merge(:timeout => @timeout, :timeout_overrides => {:greeting => log_timeout}, :transport_wrapper => Thrift::BufferedTransport)
224
+ )
225
+ assert_raises(Greeter::Client::TransportException) do
226
+ client.greeting("someone")
227
+ end
228
+ end
229
+ assert((measurement.real > log_timeout), "#{measurement.real} < #{log_timeout}")
230
+ end
231
+ end
232
+
233
+ def test_retry_period
234
+ client = ThriftClient.new(Greeter::Client, @servers[0,2], @options.merge(:server_retry_period => 1, :retries => 2))
235
+ assert_raises(ThriftClient::NoServersAvailable) { client.greeting("someone") }
236
+ sleep 1.1
237
+ assert_raises(ThriftClient::NoServersAvailable) { client.greeting("someone") }
238
+ end
239
+
240
+ def test_connect_retry_period
241
+ client = ThriftClient.new(Greeter::Client, @servers[0], @options.merge(:server_retry_period => 0))
242
+ assert_raises(ThriftClient::NoServersAvailable) { client.connect! }
243
+ end
244
+
245
+ def test_client_with_retry_period_drops_servers
246
+ client = ThriftClient.new(Greeter::Client, @servers[0,2], @options.merge(:server_retry_period => 1, :retries => 2))
247
+ assert_raises(ThriftClient::NoServersAvailable) { client.greeting("someone") }
248
+ sleep 1.1
249
+ assert_raises(ThriftClient::NoServersAvailable) { client.greeting("someone") }
250
+ end
251
+
252
+ def test_oneway_method
253
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:server_max_requests => 2, :retries => 2))
254
+ assert_nothing_raised do
255
+ response = client.yo("dude")
256
+ end
257
+ end
258
+
259
+ def test_server_max_requests_with_downed_servers
260
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:server_max_requests => 2, :retries => 2))
261
+ client.greeting("someone")
262
+ last_client = client.last_client
263
+ client.greeting("someone")
264
+ assert_equal last_client, client.last_client
265
+
266
+ # This next call maxes out the requests for that "client" object
267
+ # and moves on to the next.
268
+ client.greeting("someone")
269
+ assert_not_equal last_client, new_client = client.last_client
270
+
271
+ # And here we should still have the same client as the last one...
272
+ client.greeting("someone")
273
+ assert_equal new_client, client.last_client
274
+
275
+ # Until we max it out, too.
276
+ client.greeting("someone")
277
+ assert_not_equal last_client, client.last_client
278
+ end
279
+
280
+ private
281
+
282
+ def stub_server(port)
283
+ socket = TCPServer.new('127.0.0.1', port)
284
+ Thread.new { socket.accept }
285
+ yield socket
286
+ ensure
287
+ socket.close
288
+ end
289
+ end