@@ -129,6 +129,90 @@ def test_final_errors
129129 TestMiddleware . calls . clear
130130 end
131131
132+ def test_final_errors_during_reconnect
133+ client = new_client ( reconnect_attempts : 1 )
134+ simulate_network_errors ( client , [ "PING" , "HELLO" ] ) do
135+ assert_raises ConnectionError do
136+ client . call ( "PING" )
137+ end
138+ end
139+
140+ calls = TestMiddleware . calls . select { |type , _ | type == :call }
141+ assert_equal 1 , calls . size
142+
143+ call = calls [ 0 ]
144+ assert_equal :error , call [ 1 ]
145+ assert_equal [ "PING" ] , call [ 2 ]
146+ refute_predicate call [ 3 ] , :final?
147+
148+ pipeline_calls = TestMiddleware . calls . select { |type , _ | type == :pipeline }
149+ assert_equal 2 , pipeline_calls . size
150+
151+ failing_pipeline = pipeline_calls [ 1 ]
152+ assert_equal :error , failing_pipeline [ 1 ]
153+ assert_equal [ [ "HELLO" , "3" ] ] , failing_pipeline [ 2 ]
154+ assert_predicate failing_pipeline [ 3 ] , :final?
155+ end
156+
157+ def test_command_error_final
158+ tcp_server = TCPServer . new ( "127.0.0.1" , 0 )
159+ tcp_server . setsockopt ( Socket ::SOL_SOCKET , Socket ::SO_REUSEADDR , true )
160+ port = tcp_server . addr [ 1 ]
161+
162+ server_thread = Thread . new do
163+ session = tcp_server . accept
164+ session . write ( "-Whoops\r \n " )
165+ session . close
166+ end
167+
168+ assert_raises CommandError do
169+ new_client ( host : "127.0.0.1" , port : port , reconnect_attempts : 1 , protocol : 2 ) . call ( "PING" )
170+ end
171+
172+ calls = TestMiddleware . calls . select { |type , _ | type == :call }
173+ assert_equal 1 , calls . size
174+ call = calls [ 0 ]
175+ assert_equal :error , call [ 1 ]
176+ assert_equal [ "PING" ] , call [ 2 ]
177+ assert_predicate call [ 3 ] , :final?
178+ ensure
179+ server_thread &.kill
180+ end
181+
182+ def test_protocol_error
183+ tcp_server = TCPServer . new ( "127.0.0.1" , 0 )
184+ tcp_server . setsockopt ( Socket ::SOL_SOCKET , Socket ::SO_REUSEADDR , true )
185+ port = tcp_server . addr [ 1 ]
186+
187+ server_thread = Thread . new do
188+ 2 . times do
189+ session = tcp_server . accept
190+ session . write ( "garbage\r \n " )
191+ session . flush
192+ session . close
193+ end
194+ end
195+
196+ assert_raises ProtocolError do
197+ new_client ( host : "127.0.0.1" , port : port , reconnect_attempts : 1 , protocol : 2 ) . call ( "PING" )
198+ end
199+
200+ calls = TestMiddleware . calls . select { |type , _ | type == :call }
201+ assert_equal 2 , calls . size
202+
203+ call = calls [ 0 ]
204+ assert_equal :error , call [ 1 ]
205+ assert_equal [ "PING" ] , call [ 2 ]
206+ refute_predicate call [ 3 ] , :final?
207+
208+ call = calls [ 1 ]
209+ assert_equal :error , call [ 1 ]
210+ assert_equal [ "PING" ] , call [ 2 ]
211+ assert_predicate call [ 3 ] , :final?
212+ ensure
213+ server_thread &.kill
214+ end
215+
132216 module DummyMiddleware
133217 def call ( command , _config , &_ )
134218 command
0 commit comments