@@ -825,13 +825,18 @@ def before
825825 client . close
826826
827827 task = reactor . async do
828- server . write ( "Hello World" )
828+ server . write ( "Hello" )
829+ server . flush
830+ server . write ( "World" )
829831 server . flush
830832 rescue Errno ::EPIPE => error
831833 error
834+ rescue Errno ::ECONNRESET => error
835+ # OpenSSL sockets may raise ECONNRESET instead of EPIPE because they may try to read when writing:
836+ error
832837 end
833838
834- expect ( task . wait ) . to be_a ( Errno ::EPIPE )
839+ expect ( task . wait ) . to be_a ( Errno ::EPIPE ) . or be_a ( Errno :: ECONNRESET )
835840
836841 write_buffer = server . instance_variable_get ( :@write_buffer )
837842 expect ( write_buffer ) . to be ( :empty? )
@@ -1016,38 +1021,72 @@ def after(error = nil)
10161021
10171022 it_behaves_like AUnidirectionalStream
10181023 it_behaves_like ABidirectionalStream
1019- it_behaves_like ASocketStream
10201024end
10211025
1022- describe "OpenSSL::SSL::SSLSocket" do
1026+ describe TCPSocket do
10231027 include Sus ::Fixtures ::Async ::ReactorContext
10241028
1025- include Sus ::Fixtures ::OpenSSL ::VerifiedCertificateContext
1026- include Sus ::Fixtures ::OpenSSL ::ValidCertificateContext
1029+ before do
1030+ server = TCPServer . new ( "localhost" , 0 )
1031+ port = server . addr [ 1 ]
1032+
1033+ @sockets = [
1034+ TCPSocket . new ( "localhost" , port ) ,
1035+ server . accept
1036+ ]
1037+
1038+ @client = IO ::Stream ::Buffered . wrap ( @sockets [ 0 ] )
1039+ @server = IO ::Stream ::Buffered . wrap ( @sockets [ 1 ] )
1040+ end
10271041
1028- let ( :sockets ) { Socket . pair ( :UNIX , :STREAM ) }
1042+ after do
1043+ @sockets . each ( &:close )
1044+ end
10291045
1030- let ( :client ) { IO :: Stream :: Buffered . wrap ( OpenSSL :: SSL :: SSLSocket . new ( sockets [ 0 ] , client_context ) ) }
1031- let ( :server ) { IO :: Stream :: Buffered . wrap ( OpenSSL :: SSL :: SSLSocket . new ( sockets [ 1 ] , server_context ) ) }
1046+ attr :client
1047+ attr :server
10321048
1033- def before
1034- super
1049+ it_behaves_like AUnidirectionalStream
1050+ it_behaves_like ABidirectionalStream
1051+ it_behaves_like ASocketStream
1052+ end
1053+
1054+ describe OpenSSL ::SSL ::SSLSocket do
1055+ include Sus ::Fixtures ::Async ::ReactorContext
1056+ include Sus ::Fixtures ::OpenSSL ::VerifiedCertificateContext
1057+ include Sus ::Fixtures ::OpenSSL ::ValidCertificateContext
1058+
1059+ before do
1060+ server = TCPServer . new ( "localhost" , 0 )
1061+ port = server . addr [ 1 ]
10351062
1036- # Closing the SSLSocket should also close the underlying IO:
1037- client . io . sync_close = true
1038- server . io . sync_close = true
1063+ @sockets = [
1064+ TCPSocket . new ( "localhost" , port ) ,
1065+ server . accept
1066+ ]
1067+
1068+ client = OpenSSL ::SSL ::SSLSocket . new ( @sockets [ 0 ] , client_context )
1069+ server = OpenSSL ::SSL ::SSLSocket . new ( @sockets [ 1 ] , server_context )
1070+
1071+ client . sync_close = true
1072+ server . sync_close = true
10391073
10401074 [
1041- Async { server . io . accept } ,
1042- Async { client . io . connect }
1075+ Async { server . accept } ,
1076+ Async { client . connect }
10431077 ] . each ( &:wait )
1078+
1079+ @client = IO ::Stream ::Buffered . wrap ( client )
1080+ @server = IO ::Stream ::Buffered . wrap ( server )
10441081 end
10451082
1046- def after ( error = nil )
1047- sockets . each ( &:close )
1048- super
1083+ after do
1084+ @sockets . each ( &:close )
10491085 end
10501086
1087+ attr :client
1088+ attr :server
1089+
10511090 it_behaves_like AUnidirectionalStream
10521091 it_behaves_like ABidirectionalStream
10531092end
0 commit comments