thrift_client-mavericks 0.8.4

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.
@@ -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