thrift_client-mavericks 0.8.4

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[1..-1]
37
+ @server = Thrift::MongrelHTTPServer.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,46 @@
1
+ require File.expand_path('test_helper.rb', File.dirname(__FILE__))
2
+ require "thrift/server/mongrel_http_server"
3
+
4
+ class ThriftClientHTTPTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @servers = ["http://127.0.0.1:1461/greeter", "http://127.0.0.1:1462/greeter", "http://127.0.0.1:1463/greeter"]
8
+ @socket = 1461
9
+ @timeout = 0.2
10
+ @options = {:protocol_extra_params => [false]}
11
+ @pid = Process.fork do
12
+ Signal.trap("INT") { exit }
13
+ Greeter::HTTPServer.new(@servers.last).serve
14
+ end
15
+ # Need to give the child process a moment to open the listening socket or
16
+ # we get occasional "could not connect" errors in tests.
17
+ sleep 0.05
18
+ end
19
+
20
+ def teardown
21
+ Process.kill("INT", @pid)
22
+ Process.wait
23
+ end
24
+
25
+ def test_bad_uri
26
+ assert_raises URI::InvalidURIError do
27
+ @options.merge!({ :protocol => Thrift::BinaryProtocol, :transport => Thrift::HTTPClientTransport })
28
+ ThriftClient.new(Greeter::Client, "127.0.0.1:1463", @options).greeting("someone")
29
+ end
30
+ end
31
+
32
+ def test_bad_uri_no_http
33
+ assert_raises ArgumentError do
34
+ @options.merge!({ :protocol => Thrift::BinaryProtocol, :transport => Thrift::HTTPClientTransport })
35
+ ThriftClient.new(Greeter::Client, "//127.0.0.1:1463", @options).greeting("someone")
36
+ end
37
+ end
38
+
39
+ def test_valid_server
40
+ assert_nothing_raised do
41
+ @options.merge!({ :protocol => Thrift::BinaryProtocol, :transport => Thrift::HTTPClientTransport })
42
+ ThriftClient.new(Greeter::Client, "http://127.0.0.1:1463/greeter", @options).greeting("someone")
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,282 @@
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_live_server
30
+ assert_nothing_raised do
31
+ ThriftClient.new(Greeter::Client, @servers.last, @options).greeting("someone")
32
+ end
33
+ end
34
+
35
+ def test_dont_raise
36
+ assert_nothing_raised do
37
+ ThriftClient.new(Greeter::Client, @servers.first, @options.merge(:raise => false)).greeting("someone")
38
+ end
39
+ end
40
+
41
+ def test_retries_correct_number_of_times
42
+ stub_server(@port) do |socket|
43
+ opts = @options.merge(:timeout => @timeout, :retries => 4, :server_retry_period => nil)
44
+ client = ThriftClient.new(Greeter::Client, "127.0.0.1:#{@port}", opts)
45
+ times_called = 0
46
+
47
+ singleton_class = (class << client; self end)
48
+
49
+ # disconnect_on_error! is called every time a server related
50
+ # connection error happens. it will be called every try (so, retries + 1)
51
+ singleton_class.send :define_method, :disconnect! do |*args|
52
+ times_called += 1 if args[0]; super *args
53
+ end
54
+
55
+ assert_raises(Greeter::Client::TransportException) { client.greeting("someone") }
56
+ assert_equal opts[:retries] + 1, times_called
57
+ end
58
+ end
59
+
60
+ def test_dont_raise_with_defaults
61
+ client = ThriftClient.new(Greeter::Client, @servers.first, @options.merge(:raise => false, :defaults => {:greeting => 1}))
62
+ assert_equal 1, client.greeting
63
+ end
64
+
65
+ def test_defaults_dont_override_no_method_error
66
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:raise => false, :defaults => {:Missing => 2}))
67
+ assert_raises(NoMethodError) { client.Missing }
68
+ end
69
+
70
+ def test_random_fall_through
71
+ assert_nothing_raised do
72
+ 10.times do
73
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:retries => 2))
74
+ client.greeting("someone")
75
+ client.disconnect!
76
+ end
77
+ end
78
+ end
79
+
80
+ def test_lazy_connection
81
+ assert_nothing_raised do
82
+ ThriftClient.new(Greeter::Client, @servers[0,2])
83
+ end
84
+ end
85
+
86
+ def test_post_conn_cb
87
+ calledcnt = 0
88
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:retries => 2))
89
+ r = client.add_callback :post_connect do |cl|
90
+ calledcnt += 1
91
+ assert_equal(client, cl)
92
+ end
93
+ assert_equal(client, r)
94
+ assert_nothing_raised do
95
+ client.greeting("someone")
96
+ client.disconnect!
97
+ end
98
+ assert_equal(1, calledcnt)
99
+ end
100
+
101
+ def test_before_method_cb
102
+ before_method_counts = Hash.new { |hash, key| hash[key] = 0 }
103
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:retries => 2))
104
+ r = client.add_callback :before_method do |method_name|
105
+ before_method_counts[method_name.to_sym] += 1
106
+ end
107
+ assert_equal(client, r)
108
+ assert_nothing_raised do
109
+ client.greeting("someone")
110
+ client.yo("dude")
111
+ client.yo("dawg")
112
+ client.disconnect!
113
+ end
114
+ assert_equal({:greeting => 1, :yo => 2}, before_method_counts)
115
+ end
116
+
117
+ def test_on_exception_cb
118
+ on_exception_counts = Hash.new { |h1, method_name| h1[method_name] = Hash.new { |h2, clazz| h2[clazz] = 0 }}
119
+ client = ThriftClient.new(Greeter::Client, @servers[0,2], @options.merge(:retries => 2))
120
+ r = client.add_callback :on_exception do |error, method_name|
121
+ on_exception_counts[method_name.to_sym][error.class] += 1
122
+ end
123
+ assert_equal(client, r)
124
+ assert_raises(ThriftClient::NoServersAvailable) do
125
+ client.greeting("someone")
126
+ client.disconnect!
127
+ end
128
+ assert_equal({:greeting => {ThriftClient::NoServersAvailable => 1}}, on_exception_counts)
129
+ end
130
+
131
+ def test_unknown_cb
132
+ calledcnt = 0
133
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:retries => 2))
134
+ r = client.add_callback :unknown do |cl|
135
+ assert(false)
136
+ end
137
+ assert_equal(nil, r)
138
+ end
139
+
140
+ def test_multiple_cb
141
+ calledcnt = 0
142
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:retries => 2))
143
+ 2.times do |i|
144
+ r = client.add_callback :post_connect do |cl|
145
+ calledcnt += 1
146
+ assert_equal(client, cl)
147
+ end
148
+ assert_equal(client, r)
149
+ end
150
+ assert_nothing_raised do
151
+ client.greeting("someone")
152
+ client.disconnect!
153
+ end
154
+ assert_equal(2, calledcnt)
155
+ end
156
+
157
+ def test_no_servers_eventually_raise
158
+ wascalled = false
159
+ client = ThriftClient.new(Greeter::Client, @servers[0,2], @options.merge(:retries => 2))
160
+ client.add_callback :post_connect do
161
+ wascalled = true
162
+ end
163
+ assert_raises(ThriftClient::NoServersAvailable) do
164
+ client.greeting("someone")
165
+ client.disconnect!
166
+ end
167
+ assert(!wascalled)
168
+ end
169
+
170
+ def test_socket_timeout
171
+ stub_server(@port) do |socket|
172
+ measurement = Benchmark.measure do
173
+ assert_raises(Greeter::Client::TransportException) do
174
+ ThriftClient.new(Greeter::Client, "127.0.0.1:#{@port}",
175
+ @options.merge(:timeout => 1, :connect_timeout => 0.5)
176
+ ).greeting("someone")
177
+ end
178
+ end
179
+ assert(measurement.real > 0.5 && measurement.real < 1.05)
180
+ end
181
+ end
182
+
183
+ def test_framed_transport_timeout
184
+ stub_server(@port) do |socket|
185
+ measurement = Benchmark.measure do
186
+ assert_raises(Greeter::Client::TransportException) do
187
+ ThriftClient.new(Greeter::Client, "127.0.0.1:#{@port}",
188
+ @options.merge(:timeout => @timeout, :connect_timeout => @timeout)
189
+ ).greeting("someone")
190
+ end
191
+ end
192
+ assert((measurement.real > @timeout), "#{measurement.real} < #{@timeout}")
193
+ end
194
+ end
195
+
196
+ def test_buffered_transport_timeout
197
+ stub_server(@port) do |socket|
198
+ measurement = Benchmark.measure do
199
+ client = ThriftClient.new(Greeter::Client, "127.0.0.1:#{@port}",
200
+ @options.merge(:timeout => @timeout, :transport_wrapper => Thrift::BufferedTransport, :connect_timeout => @timeout)
201
+ )
202
+ assert_raises(Greeter::Client::TransportException) do
203
+ client.greeting("someone")
204
+ end
205
+ end
206
+ assert((measurement.real > @timeout), "#{measurement.real} < #{@timeout}")
207
+ end
208
+ end
209
+
210
+ def test_buffered_transport_timeout_override
211
+ # FIXME Large timeout values always are applied twice for some bizarre reason
212
+ log_timeout = @timeout * 4
213
+ stub_server(@port) do |socket|
214
+ measurement = Benchmark.measure do
215
+ client = ThriftClient.new(Greeter::Client, "127.0.0.1:#{@port}",
216
+ @options.merge(:timeout => @timeout, :timeout_overrides => {:greeting => log_timeout}, :transport_wrapper => Thrift::BufferedTransport)
217
+ )
218
+ assert_raises(Greeter::Client::TransportException) do
219
+ client.greeting("someone")
220
+ end
221
+ end
222
+ assert((measurement.real > log_timeout), "#{measurement.real} < #{log_timeout}")
223
+ end
224
+ end
225
+
226
+ def test_retry_period
227
+ client = ThriftClient.new(Greeter::Client, @servers[0,2], @options.merge(:server_retry_period => 1, :retries => 2))
228
+ assert_raises(ThriftClient::NoServersAvailable) { client.greeting("someone") }
229
+ sleep 1.1
230
+ assert_raises(ThriftClient::NoServersAvailable) { client.greeting("someone") }
231
+ end
232
+
233
+ def test_connect_retry_period
234
+ client = ThriftClient.new(Greeter::Client, @servers[0], @options.merge(:server_retry_period => 0))
235
+ assert_raises(ThriftClient::NoServersAvailable) { client.connect! }
236
+ end
237
+
238
+ def test_client_with_retry_period_drops_servers
239
+ client = ThriftClient.new(Greeter::Client, @servers[0,2], @options.merge(:server_retry_period => 1, :retries => 2))
240
+ assert_raises(ThriftClient::NoServersAvailable) { client.greeting("someone") }
241
+ sleep 1.1
242
+ assert_raises(ThriftClient::NoServersAvailable) { client.greeting("someone") }
243
+ end
244
+
245
+ def test_oneway_method
246
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:server_max_requests => 2, :retries => 2))
247
+ assert_nothing_raised do
248
+ response = client.yo("dude")
249
+ end
250
+ end
251
+
252
+ def test_server_max_requests_with_downed_servers
253
+ client = ThriftClient.new(Greeter::Client, @servers, @options.merge(:server_max_requests => 2, :retries => 2))
254
+ client.greeting("someone")
255
+ last_client = client.last_client
256
+ client.greeting("someone")
257
+ assert_equal last_client, client.last_client
258
+
259
+ # This next call maxes out the requests for that "client" object
260
+ # and moves on to the next.
261
+ client.greeting("someone")
262
+ assert_not_equal last_client, new_client = client.last_client
263
+
264
+ # And here we should still have the same client as the last one...
265
+ client.greeting("someone")
266
+ assert_equal new_client, client.last_client
267
+
268
+ # Until we max it out, too.
269
+ client.greeting("someone")
270
+ assert_not_equal last_client, client.last_client
271
+ end
272
+
273
+ private
274
+
275
+ def stub_server(port)
276
+ socket = TCPServer.new('127.0.0.1', port)
277
+ Thread.new { socket.accept }
278
+ yield socket
279
+ ensure
280
+ socket.close
281
+ end
282
+ end